菜鸟学设计模式----过滤器模式
来源:互联网 发布:excel公开课数据分析 编辑:程序博客网 时间:2024/05/21 06:54
过滤器模式或者说是标准模式是一种设计模式,它允许开发人员使用不同标准去过滤同一组对象,通过逻辑运算,以解耦的方式将它们连接起来。这种类型的设计模式属于结构型模式,它结合 多个标准来获取单一标准。
实现
创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。
第一步:创建一个类,在该类上应用标准
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 String getGender() { return gender; } public String getMaritalStatus() { return maritalStatus; } }
第二步:为标准创建一个接口
public interface Criteria { public List<Person> meetCriteria(List<Person> persons);}
第三步:创建实现了 Criteria 接口的实体类
- CriteriaMale
public class CriteriaMale implements Criteria { @Override 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
public class CriteriaFemale implements Criteria { @Override 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
public class CriteriaSingle implements Criteria { @Override 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
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
public class OrCriteria implements Criteria { private Criteria criteria; private Criteria otherCriteria; public OrCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } @Override 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; }}
第四步:使用不同的标准和它们的结合来过滤Person对象的列表
public class OrCriteria implements Criteria { private Criteria criteria; private Criteria otherCriteria; public OrCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } @Override 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; }}
第四步:使用不同的标准和它们的结合来过滤Person对象的列表
public class CriteriaPatternDemo { 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)); } public static void printPersons(List<Person> persons){ for (Person person : persons) { System.out.println("Person : [ Name : " + person.getName() +", Gender : " + person.getGender() +", Marital Status : " + person.getMaritalStatus() +" ]"); } } }
第五步:验证输出结果
Males: Person : [ Name : Robert, Gender : Male, Marital Status : Single ]Person : [ Name : John, Gender : Male, Marital Status : Married ]Person : [ Name : Mike, Gender : Male, Marital Status : Single ]Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]Females: Person : [ Name : Laura, Gender : Female, Marital Status : Married ]Person : [ Name : Diana, Gender : Female, Marital Status : Single ]Single Males: Person : [ Name : Robert, Gender : Male, Marital Status : Single ]Person : [ Name : Mike, Gender : Male, Marital Status : Single ]Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]Single Or Females: Person : [ Name : Robert, Gender : Male, Marital Status : Single ]Person : [ Name : Diana, Gender : Female, Marital Status : Single ]Person : [ Name : Mike, Gender : Male, Marital Status : Single ]Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
从输出结果来看,根据不同的过滤条件,成功过滤出了males、females、single males、single or females。在这里,只是先了解一下过滤器模式的思想,在真实场景使用过滤器模式的话,往往要复杂的多。
阅读全文
0 0
- 菜鸟学设计模式----过滤器模式
- 菜鸟学设计模式之代理模式
- 菜鸟学设计模式----观察者模式
- 菜鸟学设计模式----责任链模式
- 菜鸟学设计模式----建造者模式
- 菜鸟学设计模式----原型模式
- 菜鸟学设计模式----外观模式
- 菜鸟学设计模式----装饰器模式
- 菜鸟学设计模式----组合模式
- 菜鸟学设计模式----状态模式
- 菜鸟学设计模式----桥接模式
- 菜鸟学设计模式----代理模式
- 菜鸟学设计模式----迭代器模式
- 菜鸟学设计模式之一思想准备
- 菜鸟学设计模式系列笔记之设计模式概论
- 设计模式--过滤器模式
- 设计模式-过滤器模式
- 菜鸟学设计模式系列笔记之简单工厂模式
- poj 2312 bfs+优先队列 入门题
- mybatis批量插入函数报“Parameter '__frch_item_0' not found. Available parameters are [list]”错误
- NPM使用介绍
- 使用Map向SQL中传递多个参数
- 图像二值化、提取边缘
- 菜鸟学设计模式----过滤器模式
- Codeforces Round #434 Did you mean...
- MySQL学习入门
- Sublime Text3常使用的快捷键
- 初识html
- 定制库到本地资源库
- 最简单的基于librtmp的示例:发布(FLV通过RTMP发布)
- 总结之linux下网络编程
- Salesforce中使用Apex Test Class(测试类)测试Extension类型实例