设计模式--过滤器模式
来源:互联网 发布:银魂用哪个软件下载 编辑:程序博客网 时间:2024/05/16 04:40
过滤器模式(Filter Pattern)
过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把他们连接起来。大类划分为结构型模式,它结合多个标准来获得单一标准。
介绍
意图:在保证解耦的前提下连接多个标准来过滤一组对象。
应用场景:过滤标准较多,且分散。
优点:1. 解耦性高。2. 连接过滤对象的多组标准时,减轻了实现复杂度。
缺点:1. 需要较好的设计。
注意事项:根据具体的应用场景在选择确认该设计模式,否则会增加系统的复杂度。
实现
我们将创建一个Person对象、Criteria接口和实现了该接口的实体类,来过滤Person对象的列表。CriteriaPatternDemo,我们的演示类使用Criteria对象,基于各种标准和它们的结合来过滤Person对象的列表。
步骤 1
创建一个类,在该类上应用标准。 Person.java
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; } }
步骤 2
为标准(Criteria)创建一个接口。 Criteria.java
import java.util.List;public interface Criteria { public List<Person> meetCriteria(List<Person> persons);}
步骤 3
创建实现了Criteria接口的实体类。 CriteriaMale.java
import java.util.ArrayList;import java.util.List;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.java
import java.util.ArrayList;import java.util.List;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.java
import java.util.ArrayList;import java.util.List;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.java
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
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; } @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; }}
步骤 4
使用不同的标准(Criteria)和它们的结合来过滤Person对象的列表。 CriteriaPatternDemo.java
import java.util.ArrayList; import java.util.List;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() +" ]"); } } }
步骤 5
验证输出。
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 ]
0 0
- 设计模式--过滤器模式
- 设计模式-过滤器模式
- 设计模式之过滤器模式
- 设计模式之过滤器模式
- 设计模式之过滤器模式
- 设计模式:Filter过滤器
- 设计模式学习笔记--过滤器模式
- 设计模式学习笔记--拦截过滤器模式
- 设计模式笔记八:过滤器模式
- java 设计模式之过滤器模式(Filter)
- 设计模式(八)过滤器模式
- 设计模式学习之过滤器模式
- java设计模式之过滤器模式
- 菜鸟学设计模式----过滤器模式
- 设计模式【过滤器模式Filter Pattern】
- 设计模式(9)--过滤器模式
- 设计模式(30)--拦截过滤器模式
- 设计模式【拦截过滤器模式InterceptingFileterPattern】
- Android中的复制粘贴
- iOS——ARC桥接转换中__bridge、__bridge_retained和__bridge_transfer前缀的用法
- Spring中bean的配置
- SQL中的分组和组函数
- Message: 'phantomjs' executable needs to be in PATH. 处理
- 设计模式--过滤器模式
- Analysis of Haswell’s Transactional Memory
- Android studio 设置作者
- canvas、bitmap、paint之间是什么关系
- 11 Python pyinstaller--将Python程序打包成单独的exe可执行文件
- 改变页面颜色
- Fragment 一些有用的知识点
- 构建五位数的反序数
- 【Unity5.x Shaders】Shader中的Texture纹理