`
xizhenyin
  • 浏览: 51491 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

使用匿名类实现的查询

阅读更多

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

 

传统写法:

 
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这段代码成功的把查询条件作为一个接口分离了出去,接口代码如下:
wpublic 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


分享到:
评论

相关推荐

    ASP.NET中实现根据匿名类、datatable、sql生成实体类

    1、EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2、通过datatable反射实体需要先建一个类 ,头痛 3、通过SQL语句返回的实体也需要先建一个类 ,头痛 4、如果通过代码生成器要写模版,需要...

    JAVA实验报告

    (三)建立独立运行的窗口界面并使用匿名类 36 (四)使用 Swing 组件 39 (五)使用自定义对话框与内部类 41 实验6 图形处理 44 一、实验目的 44 二、实验要求 44 三、实验内容 44 (一)使用图形类 Graphics 44 ...

    javase基础练习_模拟电影购票系统_黑马课程

    Ⅳ.lambda表达式遍历集合,以及比较器comparator()匿名内部类的使用 V.使用Stream流操纵集合 功能: ①日志框架搭建、系统角色设计 ②首页、登录、商家界面、用户界面实现 ③商家功能-展示详情、影片上架、退出 ④...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    27.2.3 使用task类实现并行处理 557 27.2.4 使用parallel类对任务进行抽象 564 27.2.5 什么时候不使用parallel类 568 27.2.6 从任务返回值 571 27.3 任务和ui线程一起使用 574 27.4 取消任务和处理异常 578 ...

    jsp+mysql实现的宠物商城源代码+数据库,基于JavaWeb的宠物商城

    实现功能 1.顾客,登陆注册,修改个人资料,宠物信息查询,宠物信息分类查询 (1).狗狗类 (2).猫猫类 (3).宠物周边 2.可以将喜欢的宠物加入购物车,并结算,查看订单,确认收货,评价订单,用户帮助,积分等 3.后台...

    LINQ 实战 1/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 3/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 4/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 2/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 7/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 11/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 5/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 6/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 8/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 10/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

    LINQ 实战 9/11

    8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML ...

Global site tag (gtag.js) - Google Analytics