[Design Pattern] Filter Pattern 简单案例
Filter Pattern,即过滤模式,通过不同的过滤标准,或者低耦合将过滤标准组合在一起,对一组对象进行过滤,属于结构类的设计模式。
下面是一个过滤模式的简单案例。
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
[Design Pattern] Filter Pattern 简单案例的更多相关文章
- [Design Pattern] Facde Pattern 简单案例
Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ...
- [Design Pattern] Front Controller Pattern 简单案例
Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...
- [Design Pattern] Observer Pattern 简单案例
Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...
- [Design Pattern] Mediator Pattern 简单案例
Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...
- [Design Pattern] Iterator Pattern 简单案例
Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...
- [Design Pattern] Command Pattern 简单案例
Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ...
- [Design Pattern] Proxy Pattern 简单案例
Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ...
- [Design Pattern] Flywight Pattern 简单案例
Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...
- [Design Pattern] Adapter Pattern 简单案例
Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式. 或者叫做,转换器模式. 下面是一个转换器模式简单案例. 假设已有 AudioPlayer 专门播放 m ...
随机推荐
- JDK5-静态导入
import static 1. 导入一个类内所有静态成员 import static java.lang.Math.*; public class StaticImport { public sta ...
- 初学coreData数据库读取不成功的问题
写了一个从数据库读取数据显示列表的代码,结果却无法运行,提示找不到对应的entity,也就是数据库中的某一个表 我查遍了代码也没有发现什么逻辑错误,在appDelegate也初始化了相关数据库,在界面 ...
- Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用
1. 可以参照之前写的笔记: Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...
- java中-静态代码块、构造代码块、构造方法的联系
例如该题: 1 class Fu{ static { System.out.println("这是父类静态代码块"); } { System.out.println("这 ...
- redis 自启动脚本
看到网上许多手写的亦或复制的redis开机自启动脚本, 版本好多, 其实最简单的可以从下载的redis文件里找得到 我下载的redis是 3.0.3 版本的, 对于其他版本, 没有详细查看, 有需要 ...
- 国都企信通短信平台发送手机短信的python脚本一例
一年前,由于工作需要,给以色列的同事解释一下国都短信平台的短信发送格式,本来不懂python的我硬着头皮写了一个sample,比较粗,能用,但不优美,希望以后学会python能改得像我同事写的那么优雅 ...
- KMP学习笔记
功能 字符串T,长度为n. 模板串P,长度为m.在字符串T中找到匹配点i,使得从i开始T[i]=P[0], T[i+1]=P[1], . . . , T[i+m-1]=P[m-1] KMP算法先用O( ...
- 数据库内存泄漏——A SQLiteConnection object for database '/data/data/.../databases/....db' was leaked!
详细异常: A SQLiteConnection object for database '/data/data/.../database/....db' was leaked! Please ...
- 初定为EGame
[Q]在纠结到底要用什么方式写博客,是原生态记录框架编写过程(有点所谓的手把手教学的感觉有木有),还是每个模块整合完毕后写分析文章,新手没有写过博客,不知道那种效果好.朋友们给点建议? 这套框架的初衷 ...
- asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
很多人在.net开发Web站点中引用了COM组件,调试时一切正常,但一发布到IIS下就提示如下错误: 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005 ...