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. composer 说明<转>

    转自  http://blog.csdn.net/zzulp/article/details/18981029 Composer是一个基于项目的依赖管理器,负责将PHP项目所依赖的包或库安装到项目所在 ...

  2. AIDL跨进程通信

    Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...

  3. PHP 注意问题

    一.表单  1,上传文件的表单使用post方式:还要加上enctype='multipart/form-data'.     2,一般要加上隐藏域:<input type=hidden name ...

  4. maven指定构建的编码格式

    pom.xml文件添加如下内容: <properties>    <project.build.sourceEncoding>UTF-8</project.build.s ...

  5. (转)php中global和$GLOBALS[]的分析之一

    PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖     这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使 ...

  6. SQLServer2008收缩数据库日志

    -- Set to SIMPLE mode ALTER DATABASE [DATABASE_NAME] SET RECOVERY SIMPLE; -- Shrink the db ); -- Set ...

  7. 嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境

    操作系统:Ubuntu12.04 AMD64位 交叉编译环境:arm-Linux gcc版本4.4.3 前言: 首先理解一下交叉编译的意思.我们要给嵌入式设备写应用程序,但是又不能在嵌入式设备上完成所 ...

  8. 【USACO 2.4.3】牛的旅行

    [描述] 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  9. javascript学习(知识点整理)

    有了这个代码,就可以在定义 中增加更多的控制了 后面会举例关于extjs定义的更多控制     此种方案可以解决定义时需要一些函数调用的情况 函数作用域和声明提前: 即由于js是解释性语言,在执行前会 ...

  10. 初涉JavaScript模式 (4) : 构造函数

    什么是构造函数? 构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不 ...