使用匿名类实现的查询

      查询符合规定公司职员,使用匿名类实现。

 

传统写法:

 
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.换查询条件的话,上面除了"筛选"一句有变化外其它都是模板代码,重复性很高.

 

真正符合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);
}

 

完整代码:

 

 成员类:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值