Java-怎么设计一个这样的类
页面有不同的统计类型,比如按条件A、B、C、D来统计,返回页面的是同一个Report对象,我想在Action里这样写:List<Report> rs = reportService.findReportsList(type, did, vid);
(reportService是我定义接口ReportService的引用)然后根据type来区别是按A/B/C或D来查找数据并返回,比如,我先按A查找,这当然我可以用同一个类(ReportServiceImpl)来继承ReportService实现为ABCD的条件的查询,但这样做,在同一个类的同一个方法加判断的统计,代码会很长很多,或是同一个类里根据ABCD不同条件执行不同方法,但我感觉这样不易维护,还不直观。我就想这样,Action里还这样写:List<Report> rs = reportService.findReportsList(type, did, vid);然后到findReportsList()里,或是到什么模式里,分别调用不同的类来实现条件为ABCD的查询,返回的结果都是Report对象来接收,可能我说得乱,但总的来说,我是想页面调用同一个方法到后台的action里,然后,再在action里用同一方法来返回根据ABCD等不同条件统计回来的数据,而又不想把ABCD条件都丢到同一个类里面处理。我应该用什么模式来实现,或是有什么办法能让我更简洁易维护的方法去实现的?谢谢了……新人,没分给,不好意思!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
上面的兄弟,谢谢你们的建议,dropme兄弟的建议有些不明白,赵庆侧兄弟的的建议这个是简单的工厂模式,用来实例化不同对象时用的,我这里是返回同一个对象,我在实现类里取数据并在这里组装数据后,再set进report里,感觉我把逻辑层和访问数据层写到一起了,我暂时想到的是,MVC,把action这层转发到service,方法getReport(){//在这里面先根据类型访问数据库层,由DAO层返回数据,到service层,然后我再在service层根据类型把得到的数据进行业务处理,最后返回view层},我感觉这样做有点笨,在service里的代码也会不少,因为在同一个类里,我实在想不出什么办法了,到时有更好的办法,我会在这和大家分享的,也希望大家能来指点一个我……谢谢各位的支持
分别把ABCD做成4个实现buildReport()接口的子类,然后用工厂方法来创建不同的对象.
public class Factory{
public static Sample creator(int which){
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
可以用工厂模式加模版模式,不要通过type判断类型,而是把一个类型做为一种子类,公共代码就在基类实现,从基类派生各种type的子类。
比如说
TReportBase = class
TReportType1 = class(TReportBase){}
TReportType2 = class(TReportBase){}
然后在action里判断type,根据不同的type生成不同的对象。或者再来一个工厂,在action里把type传给工厂,让工厂生成不同的type对象。
因为TReportType1,TReportType2都是从TReportBase派生的,所以在action里你可以给view传一个TReportBase类型就行了
这就是对象的多态了。呵呵
看了你的问题之后,回答如下:
1.从方法名称上看无非就是想返回一个列表。那么应该是去查询数据库,根据不同类型有不同的sql,然后返回列表。如果是这样,那么你可以写一个方法,根本类型的不同拼装对应的sql,然后统一执行sql,返回一个列表。这里可能会有一个封装对象的问题,解决方法就是把ABCD四个类型都让实现一个接口,接口里必须包含一个方法用来封装记录为对象的,参数就是java.sql.ResultSet
2.如果引申来看,程序会根据类型的不同,分别处理不同的业务,并不是像上面说的查数据库,那么可以用工厂模式。写一个接口,然后每种类型一个类,去实现接口。然后调用方法根据不同的类型获取对应的处理类。
程序中用到if else是再说难免的,虽然说提倡不要反复if else,但必要的必不可少。