继往开来 吐故纳新
日历
网志分类
· 所有网志 (990)
· 个人作品 (62)
· 软件设计 (33)
· 面向对象编程 (22)
· JavaAPI (39)
· Java开源工具 (31)
· Swing (34)
· Java语法细节 (39)
· 样式表CSS (12)
· XML (10)
· J2EE(JavaEE) (23)
· 算法数据结构 (64)
· 正则表达式 (4)
· 软件知识 (6)
· Java线程 (9)
· Web开发.Jsp/Servlet/Struts (20)
· 程序随想录 (7)
· Spring (5)
· Hibernate (7)
· J2SE 高级 (2)
· J2SE 高级 (0)
· Web开发.Ajax (16)
· Web开发.JavaScript (43)
· DB4O (2)
· Web开发.CSS/Html (22)
· C# (20)
· ERP (4)
· JDBC (1)
· 编程资源 (16)
· 编程感悟 (29)
· DB/Sql (13)
· VB (29)
· VC (2)
· 桌面脚本 (3)
· 新兴软件 (3)
· 英语学习 (21)
· 网文转载 (159)
· 职场风云 (39)
· 诗词歌赋 (32)
· 生活感言 (77)
· 奇文共赏 (13)
· 财经纵横 (6)
· 未分类 (11)
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 偶要雷锋
· 豆瓣
· nczonline
· 当当网
· easyjf中文站
· Donews
· 天极Java文章列表
· W3CSchool
· taiten的BLOG
· Dojo中国
· Dojo
· Extjs.com
· Lifehack中文网志
· JaveEye的一个AS专题
· Banq's JDon
· Java 中文网址大全
· 梦想Java
· 360Doc个人图书馆
· java开源大全
· 我在硅谷动力的软件下载站
· 站长中国
· 随意贴
· CSS教学素材站
· java 参考中文站
· 面向构件与SOA社区
· 彩字生成
· 派派小说论坛
· 如坐春风
· 英语学习网
· BBC CHina
· www.dlbang.com
· 古文竖排格式在线转化工具
· 免费家谱
· 图片上传基地
· 风景壁纸
· 和风细雨
· MyC#BlogInCsdn

订阅 RSS

0207427

歪酷博客

开此博一为经验积累,二为资料收集,三为同道交流,四为资源共享.
« 上一篇: 【整理】这种关于查询的内部类写法值得提倡 下一篇: 【转贴】20个具有代表性的web2.0网站配色 »
Junglesong @ 2007-04-01 18:31

需求:从公司的职员列表中,找出男性且年龄大于22的成员.

传统写法:
  // 传统查询
  List allmembers=company.getMembers();// 取得所有成员
  List results=new ArrayList();// 结果列表
  
  for(Iterator it=allmembers.iterator();it.hasNext();){
   Member member=(Member)it.next();
   
   if(member.getAge()>22 && member.isMale()){  // 筛选
    results.add(member);
   }
  } 
  System.out.println(results); // 输出结果
输出:
[Name=关羽 Age=28 Male=true, Name=张飞 Age=27 Male=true]

这种写法没有错,但是不是面向对象的写法,它有以下缺陷:
1.查询条件和筛选过程没有分离.
2.这样写的后果使Company变成了一个失血模型而不是领域模型.
3.换查询条件的话,上面除了 筛选 一句有变化外其它都是模板代码,重复性很高.

真正符合OO的查询应该是这样:
  // OO化查询
  MemberFilter filter1=new MemberFilter(){
   public boolean accept(Member member) {
        return member.isMale() && member.getAge()>22;
   }
  };
  
  List ls=company.listMembers(filter1);
  System.out.println(ls);
输出:
[Name=关羽 Age=28 Male=true, Name=张飞 Age=27 Male=true]

这段代码成功的把查询条件作为一个接口分离了出去,接口代码如下:
public interface MemberFilter{
 public boolean accept(Member member); 
}

而类Company增加了这样一个函数:
 public List listMembers(MemberFilter memberFilter){
  List retval=new ArrayList();
  
  for(Iterator it=members.iterator();it.hasNext();){
   Member member=(Member)it.next();
   
   if(memberFilter.accept(member)){
    retval.add(member);
   }
  }  
  
  return retval;
 }

这就把模板代码归结到了类内部,外面不会重复书写了.Company也同时拥有了数据和行为,而不是原来的数据容器了.

这才是OO化的查询.

全部代码请见:
http://www.blogjava.net/Files/junglesong/Filter.rar








评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定