[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 ...
随机推荐
- Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...
- Linux开发工具之Makefile(下)
二.Makefile(下) 01.make常用内嵌函数 函数调用 $(function arguments) $(wildcard PATTERN) 当前目录下匹配模式的文件 例如:src ...
- 详谈typedef的用法
我们都知道typedef是类型重定义,既然是重定义就不可能出现新的数据类型,只是将已有的数据类型进行换个名字而已,但是这有什么用呢?可能我们学的时候,给的例子都是:typedef int INT; 然 ...
- python-查询员工信息表
python查询员工信息表 基本要求: 用户可以模糊查询员工信息 显示匹配了多少条,匹配字符需要高亮显示 代码: #!/usr/env python #coding:utf-8 import time ...
- SpringMVC11文件上传
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- uva 1146 Now or late (暴力2-SAT)
/* 裸地2-SAT问题 关键是模型转化 最小的最大 显然二分 关键是Judge的时候怎么判断 每个航班是早是晚直接影响判断 早晚只能选一个 如果我们定义bool变量xi表示 i航班是否早到 每个航班 ...
- js正则表达式验证大全
/判断输入内容是否为空 function IsNull(){ var str = document.getElementById('str').value.trim(); ...
- asp.net使用dorpdownlist绑定无限级分类
/// <summary> /// 绑定父项分类 /// </summary> protected void DDLBindClass( ...
- 关于Core Data的一些整理(五)
关于Core Data的一些整理(五) 在Core Data中使用NSFetchedResultsController(以下简称VC)实现与TableView的交互,在实际中,使用VC有很多优点,其中 ...
- table标签,认识网页上的表格
有时候我们需要在网页上展示一些数据,如某公司想在网页上展示公司的库存清单.如下表: 想在网页上展示上述表格效果可以使用以下代码: 创建表格的四个元素: table.tbody.tr.th.td 1.& ...