查询符合规定公司职员,使用匿名类实现。
传统写法:
w
List allmembers=company.getMembers();//
取得所有成员
w
List results=new ArrayList();//
结果列表
w
w
for(Iterator it=allmembers.iterator();it.hasNext();){
w
Member member=(Member)it.next();
w
w
if(member.getAge()>22 && member.isMale()){ //
筛选
,
这里是把查询条件和遴选
过程融合在一起
,
条件一变立即就得加个分支
.
w
results.add(member);
w
}
w
}
这种写法没有错,但是不是面向对象的写法,它有以下缺陷:
1.查询条件和筛选过程没有分离.
2.这样写的后果使Company变成了一个失血模型而不是领域模型.
3.换查询条件的话,上面除了"筛选"一句有变化外其它都是模板代码,重复性很高.
1.查询条件和筛选过程没有分离.
2.这样写的后果使Company变成了一个失血模型而不是领域模型.
3.换查询条件的话,上面除了"筛选"一句有变化外其它都是模板代码,重复性很高.
真正符合OO的查询应该是这样:
w
Filter filter1=new Filter(){
w
public boolean isPassed(Member member) {
w
return member.isMale() && member.getAge()>22;
w
}
w
};
w
w
List ls=company.listMembers(filter1);
w
w
这段代码成功的把查询条件作为一个接口分离了出去
,
接口代码如下
:
w
public interface Filter {
public boolean isPassed(Member member);
}
public boolean isPassed(Member member);
}
完整代码:
成员类:
package com.xzy;
/**
* 职员类
* @author xizhenyin
*
*/
public class Member {
private String name;
private boolean isMale;
private int age;
private int salary;
public Member(String name,boolean isMale,int age,int salary){
this.name = name;
this.isMale = isMale;
this.age = age;
this.salary = salary;
}
public String toString(){
return "姓名"+name+" "+"性别"+isMale+" "+"年龄"+age+" "+"月薪"+salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isMale() {
return isMale;
}
public void setMale(boolean isMale) {
this.isMale = isMale;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
公司类
package com.xzy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 公司类
* @author xizhenyin
*
*/
public class Company {
private List<Member> members;
public Company(){
members = new ArrayList<Member>();
}
public void addMembers(Member m){
members.add(m);
}
public List searchMember(Filter filter1){
List<Member> retval = new ArrayList<Member>();
for(Iterator it = members.iterator();it.hasNext();){
Member m = (Member)it.next();
if(filter1.isPassed(m)){
retval.add(m);
}
}
return retval;
}
}
接口
package com.xzy;
/**
* 接口
* @author xizhenyin
*
*/
public interface Filter {
public boolean isPassed(Member member);
}
测试
package com.xzy;
/**
* 实现
*/
import java.util.ArrayList;
import java.util.List;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Member> l = new ArrayList<Member>();
Company c = new Company();
c.addMembers(new Member("AA", false, 24, 1800));
c.addMembers(new Member("DG", false, 25, 2000));
c.addMembers(new Member("GH", true, 22, 1600));
c.addMembers(new Member("QQ", false, 24, 1900));
c.addMembers(new Member("BN", true, 24, 2000));
c.addMembers(new Member("PP", true, 26, 2200));
c.addMembers(new Member("WE", false, 23, 2000));
// 匿名类
Filter filter = new Filter() {
@Override
//查询条件
public boolean isPassed(Member member) {
return (member.isMale()==true&&member.getAge() > 20 && member.getSalary() > 1300);
}
};
l = c.searchMember(filter);
for (Member member : l) {
System.out.println(member);
}
}
}
结果:
姓名GH 性别true 年龄22 月薪1600
姓名BN 性别true 年龄24 月薪2000
姓名PP 性别true 年龄26 月薪2200
w
w