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. Camera2Raw

    This sample demonstrates how to use the Camera2 API to capture RAW camera buffers and save them as D ...

  2. Java基础知识强化之IO流笔记05:try...catch...finally包含的代码是运行期的

    1. 代码示例: 上面看到的第13行:  Date  d = null;(这里必须初始化) 第14~20行使用try...catch...finally包含代码,这里的代码已经变成运行期代码.此时我们 ...

  3. Linux开发工具之Makefile(上)

    二.makefile(上) 01.make工具   利用make工具可以自动完成编译工作.这些工作包括:如果修改了某几 个源文件,则只重装新编译这几个源文件:如果某个头文件被修改了,则 重新编译所有包 ...

  4. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  5. 各种开发语言示例调用HTTP接口(示例中默认HTTP接口编码为gb2312)

    asp示例: function getHTTPPage(strurl,data)   on error resume next   set http = Server.CreateObject(&qu ...

  6. Ajax 如何提交集合到mvc后台

    1,前端请求如下 var apply = { CompanyName: $("[name='corpName']").val(), ContactUser: $("[na ...

  7. retrofit2 使用教程 及 Android 网络架构搭建 (原创)

    squareup 推出 retrofit2 已经有一段时间了,现在的版本比较稳定,没有什么大坑了.网络上的教程要么太简单,只是个Demo:要么有些落时,要么复用性比较差,所以自己写个教程,供大家参考. ...

  8. SVN设置钩子文件限制提交文件时必须填写更新日志

    进入相应SVN仓库hooks目录,编辑文件pre-commit #!/bin/sh # PRE-COMMIT HOOK## The pre-commit hook is invoked before ...

  9. 启动php-fpm报错:please specify user and group other than root

    安装好PHP之后启动报错: 启动php-fpm报错:please specify user and group other than root, pool 'default 修改 php-fpm.co ...

  10. MySQL 删除数据库

    MySQL 删除数据库 使用 mysqladmin 删除数据库 使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用 ...