07@设计模式 -(05) 筛选模式
2016-04-23 15:27
387 查看
筛选模式,也叫做条件模式。这种设计模式可以让开发人员通过使用不同的条件在一个Set集合的对象中筛选自己想要的,并通过逻辑操作方法以解耦的方式将他们串联起来。这种设计模式属于结构型设计模式(structural pattern),本质上就是将多个条件组合成一个条件。
具体实现
我们将创建一个叫Person的类,一个叫Criteria的接口和具体的实现类以实现这个接口,实现类在一组Person对象中去筛选。最后在CriteriaPatternDemo类中编写调用代码:使用Criteria对象根据多种条件在一组Person对象实例中进行筛选,或者根据这些条件的组合进行筛选。
第一步:创建一个类,这个类所生成的对象将被条件说筛选
Person.java
第二步:创建一个叫做Criteria的接口
Criteria.java
第三步:创建实现类,实现Criteria接口
CriteriaMale.java
CriteriaFemale.java
CriteriaSingle.java
AndCriteria.java
OrCriteria.java
第四步:使用不同的条件和不同条件的叠加来筛选出想要的对象
CriteriaPatternDemo.java
第五步:验证输出
具体实现
我们将创建一个叫Person的类,一个叫Criteria的接口和具体的实现类以实现这个接口,实现类在一组Person对象中去筛选。最后在CriteriaPatternDemo类中编写调用代码:使用Criteria对象根据多种条件在一组Person对象实例中进行筛选,或者根据这些条件的组合进行筛选。
第一步:创建一个类,这个类所生成的对象将被条件说筛选
Person.java
package com.patterns.filter; public class Person { private String name; private String gender; private String maritalStatus; public Person(String name, String gender, String maritalStatus) { this.name = name; this.gender = gender; this.maritalStatus = maritalStatus; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getMaritalStatus() { return maritalStatus; } public void setMaritalStatus(String maritalStatus) { this.maritalStatus = maritalStatus; } @Override public String toString() { return "Person{" + "name=" + name + ", gender=" + gender + ", maritalStatus=" + maritalStatus + '}'; } }
第二步:创建一个叫做Criteria的接口
Criteria.java
package com.patterns.filter; import java.util.List; public interface Criteria { public List<Person> meetCriteria(List<Person> persons); }
第三步:创建实现类,实现Criteria接口
CriteriaMale.java
package com.patterns.filter; import java.util.ArrayList; import java.util.List; public class CriteriaMale implements Criteria{ public List<Person> meetCriteria(List<Person> persons) { List<Person> malePersons =new ArrayList<Person>(); for(Person person : persons) { if(person.getGender().equalsIgnoreCase("MALE")) { malePersons.add(person); } } return malePersons; } }
CriteriaFemale.java
package com.patterns.filter; import java.util.ArrayList; import java.util.List; public class CriteriaFemale implements Criteria{ public List<Person> meetCriteria(List<Person> persons) { List<Person> femalePersons = new ArrayList<Person>(); for(Person person:persons) { if(person.getGender().equalsIgnoreCase("FEMALE")) { femalePersons.add(person); } } return femalePersons; } }
CriteriaSingle.java
package com.patterns.filter; import java.util.ArrayList; import java.util.List; public class CriteriaSingle implements Criteria{ public List<Person> meetCriteria(List<Person> persons) { List<Person> singlePersons = new ArrayList<Person>(); for(Person person : persons) { if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")) { singlePersons.add(person); } } return singlePersons; } }
AndCriteria.java
package com.patterns.filter; import java.util.List; public class AndCriteria implements Criteria{ private Criteria criteria; private Criteria otherCriteria; public AndCriteria(Criteria criteria,Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> firstCriteriaPersons = criteria.meetCriteria(persons); return otherCriteria.meetCriteria(firstCriteriaPersons); } }
OrCriteria.java
package com.patterns.filter; import java.util.List; public class OrCriteria implements Criteria{ private Criteria criteria; private Criteria otherCriteria; public OrCriteria(Criteria criteria,Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } public List<Person> meetCriteria(List<Person> persons) { List<Person> firstCriteriaItems = criteria.meetCriteria(persons); List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons); for(Person person : otherCriteriaItems) { if(!firstCriteriaItems.contains(person)) { firstCriteriaItems.add(person); } } return firstCriteriaItems; } }
第四步:使用不同的条件和不同条件的叠加来筛选出想要的对象
CriteriaPatternDemo.java
package com.patterns.filter; import java.util.ArrayList; import java.util.List; public class CriteriaPatternDemo { public static void printPersons(List<Person> persons) { for(Person person:persons) { System.out.println(person.toString()); } } public static void main(String args[]) { List<Person> persons =new ArrayList<Person>(); persons.add(new Person("Robert","Male","Single")); persons.add(new Person("John","Male","Married")); persons.add(new Person("Laura","Female","Married")); persons.add(new Person("Diana","Female","Single")); persons.add(new Person("Mike","Male","Single")); persons.add(new Person("Bobby","Male","Single")); Criteria male =new CriteriaMale(); Criteria female =new CriteriaFemale(); Criteria single =new CriteriaSingle(); Criteria singleMale =new AndCriteria(single, male); Criteria singleOrFemale =new OrCriteria(single, female); System.out.println("Males: "); printPersons(male.meetCriteria(persons)); System.out.println("\nFemales: "); printPersons(female.meetCriteria(persons)); System.out.println("\nSingle Males: "); printPersons(singleMale.meetCriteria(persons)); System.out.println("\nSingle Or Females: "); printPersons(singleOrFemale.meetCriteria(persons)); } }
第五步:验证输出
Males: Person{name=Robert, gender=Male, maritalStatus=Single} Person{name=John, gender=Male, maritalStatus=Married} Person{name=Mike, gender=Male, maritalStatus=Single} Person{name=Bobby, gender=Male, maritalStatus=Single} Females: Person{name=Laura, gender=Female, maritalStatus=Married} Person{name=Diana, gender=Female, maritalStatus=Single} Single Males: Person{name=Robert, gender=Male, maritalStatus=Single} Person{name=Mike, gender=Male, maritalStatus=Single} Person{name=Bobby, gender=Male, maritalStatus=Single} Single Or Females: Person{name=Robert, gender=Male, maritalStatus=Single} Person{name=Diana, gender=Female, maritalStatus=Single} Person{name=Mike, gender=Male, maritalStatus=Single} Person{name=Bobby, gender=Male, maritalStatus=Single} Person{name=Laura, gender=Female, maritalStatus=Married}
相关文章推荐
- VRP平台基本操作
- C++ OJ HDU 1159 Common Subsequence
- 万兆带宽测试方法
- c++ primer(第五版)学习笔记及习题答案代码版(第一章)
- 设置MySQL自动增长从某个指定的数开始
- Learning React Native笔记
- HDU 5671 Matrix
- 01背包与贪心的区别
- C++ OJ HDU 1243 反恐训练营
- 中文期刊分类结果记录
- select的onchange事件问题
- 微信公众平台、开放平台、智能平台区别
- 原生JS ajax框架代码
- 91. Decode Ways
- iOS 压力测试
- Nginx安装
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- ubuntu14.04安装subversion1.8相关问题
- iOS-获取视频长度和当前播放时间
- 聊聊Android编程规范