[Design Pattern] Filter Pattern 简单案例
2016-05-21 16:48
351 查看
Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式。
下面是一个过滤模式的简单案例。
Criteria 定义过滤接口,CriteriaFemale, CriteriaMale, AndCriteria, OrCriteria 类实现过滤接口。Person 是被过滤的对象。CriteriaPatternDemo 演示过滤模式。
具体代码:
过滤对象 Person 的实现
过滤接口定义
CriteriaFemal, CriteriaMale, CriteriaSingle 具体类实现 Criteria 接口,实现过滤具体逻辑
AndCriteria, OrCriteria 基于基本过滤具体,进行逻辑运算
演示代码,对一系列对象,进行单条件过滤,或者组合条件过滤
拓展性考虑
例如,要增加一个过滤标准 married
1. 增加一个文件定义 CriteriaMarried 类,使其实现 Criteria 接口,实现过滤逻辑 meetCriteria()
2. 在客户端 CriteriaPatternDemo 使用新增的类 CriteriaMarried
既可使用新扩展的过滤标准。
参考资料
Design Patterns - Filter Pattern, TutorialsPoint
下面是一个过滤模式的简单案例。
Criteria 定义过滤接口,CriteriaFemale, CriteriaMale, AndCriteria, OrCriteria 类实现过滤接口。Person 是被过滤的对象。CriteriaPatternDemo 演示过滤模式。
具体代码:
过滤对象 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 String toString(){ return "name : " + this.name + ", gender : " + this.gender + ", maritalStatus : " + this.maritalStatus; } }
过滤接口定义
import java.util.List; public interface Criteria { public List<Person> meetCriteria(List<Person> persons); }
CriteriaFemal, CriteriaMale, CriteriaSingle 具体类实现 Criteria 接口,实现过滤具体逻辑
import java.util.LinkedList; import java.util.List; public class CriteriaFemale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> meetPersons = new LinkedList<>(); for (Person p : persons){ if ("female".equals(p.getGender())){ meetPersons.add(p); } } return meetPersons; } }
import java.util.LinkedList; import java.util.List; public class CriteriaMale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> meetPersons = new LinkedList<>(); for (Person p : persons){ if ("male".equals(p.getGender())){ meetPersons.add(p); } } return meetPersons; } }
import java.util.LinkedList; import java.util.List; public class CriteriaSingle implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> meetPersons = new LinkedList<>(); for (Person p : persons){ if ("single".equals(p.getMaritalStatus())){ meetPersons.add(p); } } return meetPersons; } }
AndCriteria, OrCriteria 基于基本过滤具体,进行逻辑运算
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> meetPersons = criteria.meetCriteria(persons); meetPersons = otherCriteria.meetCriteria(meetPersons); return meetPersons; } }
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> meetPersons1 = criteria.meetCriteria(persons); List<Person> meetPersons2 = otherCriteria.meetCriteria(persons); for (Person p : meetPersons2){ if (!meetPersons1.contains(p)){ meetPersons1.add(p); } } return meetPersons1; } }
演示代码,对一系列对象,进行单条件过滤,或者组合条件过滤
import java.util.LinkedList; import java.util.List; public class CriteriaPatternDemo { public static void main(){ List<Person> persons = new LinkedList<>(); persons.add(new Person("Mike", "male", "single")); persons.add(new Person("Lucy", "female", "married")); persons.add(new Person("Vivi", "female", "single")); persons.add(new Person("Eric", "male", "married")); persons.add(new Person("Lisa", "female", "single")); System.out.println("male :"); Criteria criteriaMale = new CriteriaMale(); CriteriaPatternDemo.printListPerson(criteriaMale.meetCriteria(persons)); System.out.println("female :"); Criteria criteriaFemale = new CriteriaFemale(); CriteriaPatternDemo.printListPerson(criteriaFemale.meetCriteria(persons)); System.out.println("sinlge female :"); Criteria criterSingle = new CriteriaSingle(); Criteria singleFemale = new AndCriteria(criterSingle, criteriaFemale); CriteriaPatternDemo.printListPerson(singleFemale.meetCriteria(persons)); System.out.println("sinlge or female :"); Criteria singleOrFemale = new OrCriteria(criteriaFemale, criterSingle); CriteriaPatternDemo.printListPerson(singleOrFemale.meetCriteria(persons)); } public static void printListPerson(List<Person> persons){ for (Person p : persons){ System.out.println("[" + p + "]"); } System.out.println(""); } }
拓展性考虑
例如,要增加一个过滤标准 married
1. 增加一个文件定义 CriteriaMarried 类,使其实现 Criteria 接口,实现过滤逻辑 meetCriteria()
2. 在客户端 CriteriaPatternDemo 使用新增的类 CriteriaMarried
既可使用新扩展的过滤标准。
参考资料
Design Patterns - Filter Pattern, TutorialsPoint
相关文章推荐
- 【SSH】错误锦集
- Java 多态
- Unity3D 自发型俄罗斯大方块。
- eclipse导入tomcat 8.0x源码
- android调试输出log打印信息到本地文件
- 文件和文件系统的一点知识
- bzoj1984 月下“毛景树”
- 链接器脚本lds
- nanopi引脚定义
- 华硕a501lb5200加内存和固盘并装上win7系统并设置固盘为第一启动
- SynapticsTouchDriver 思维导图
- 判断字符串是否为数字
- startService与bindService的区别
- 深度学习进行目标识别的资源列表
- 【学生信息管理系统】总结二
- 233. Number of Digit One【H】【33】【再来一遍】
- netty 解决TCP粘包与拆包问题(一)
- 系统资源监控--windows
- Java继承
- 试题库问题[网络流24题之7]