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 简单案例的更多相关文章

  1. [Design Pattern] Facde Pattern 简单案例

    Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ...

  2. [Design Pattern] Front Controller Pattern 简单案例

    Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...

  3. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  4. [Design Pattern] Mediator Pattern 简单案例

    Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...

  5. [Design Pattern] Iterator Pattern 简单案例

    Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...

  6. [Design Pattern] Command Pattern 简单案例

    Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ...

  7. [Design Pattern] Proxy Pattern 简单案例

    Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ...

  8. [Design Pattern] Flywight Pattern 简单案例

    Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...

  9. [Design Pattern] Adapter Pattern 简单案例

    Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式. 或者叫做,转换器模式. 下面是一个转换器模式简单案例. 假设已有 AudioPlayer 专门播放 m ...

随机推荐

  1. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制

    第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...

  2. Android WindowManager的使用

    经常,我们看到在桌面上可移动的悬浮窗,这种场景还是很多的, 像流量统计,桌面歌词等,安全软件的清理小部件 这种小部件主要是通过 WindowManager ; WindowManager.Layout ...

  3. Android Studio学习随笔-移动动画的实现

    在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...

  4. python练习程序_员工信息表_基本实例

    python实现增删改查操作员工信息文件,可进行模糊查询: http://edu.51cto.com/lesson/id-13276.html http://edu.51cto.com/lesson/ ...

  5. 【Python之旅】第六篇(七):开发简易主机批量管理工具

    [Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...

  6. java 类处理工具

    public class ClassUtils { private static final Logger LOGGER = LoggerFactory.getLogger(ClassUtils.cl ...

  7. 7-http1.1和2.0的区别?

    1.多路复用:减少tcp请求 合并成一个2.首部压缩:会把多个首部压缩3.服务器推送:不用request也可以response

  8. leetcode修炼之路——13. Roman to Integer

    题目: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...

  9. [转帖]了解AmbiLight知识

    了解科技前沿的方法..American Online=AOL.algorithm算法.(Denzel say, and I don't know) Engadget瘾科技网站.英文版Engadget网 ...

  10. 3.题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

    public static void main(String[] args) {                Scanner scanner=new Scanner(System.in);      ...