设计模式:

前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案

设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。

正确使用设计模式具有以下优点:

可以提高程序员的思维能力、编程能力和设计能力。
使程序设计更加标准化、代码编制更加I程化,使软件开发效率大大提高,从而缩短软件的开发周期。
使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

过滤器模式(Filter Pattern)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来

过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern

过滤器模式属于结构型模式,它结合多个标准来获得单一标准

首先看看设计图

接下来是代码部分

1、定义实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Person {/*** 名称*/private String name;/*** 性别*/private String gender;/*** 婚姻状况*/private String maritalStatus;
}
2、定义接口
/*** 过滤器,进行筛选*/
public interface Criteria {/*** 筛选出符合标准的返回* @param persons 集合* @return 返回符合标准的集合*/List<Person> meetCriteria(List<Person> persons);
}
3、实现筛选条件
  1. 筛选出男性
    /*** 筛选出男性*/
    public class CriteriaMale implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> malePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getGender().equalsIgnoreCase("男")){malePersons.add(person);}}return malePersons;}
    }
    
  2. 筛选出女性
    /*** 筛选出女性*/
    public class CriteriaFemale implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> femalePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getGender().equalsIgnoreCase("女")){femalePersons.add(person);}}return femalePersons;}
    }
    
  3. 筛选出单身
    /*** 过滤单身*/
    public class CriteriaSingle implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> singlePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getMaritalStatus().equalsIgnoreCase("单身")){singlePersons.add(person);}}return singlePersons;}
    }
    
  4. 求两种条件交集
    /*** 两种条件的交集*/
    public class AndCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;/*** 两种类型进行组合筛选,交集* @param criteria 筛选条件* @param otherCriteria 额外条件*/public AndCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria; }/*** 两种条件进行组合赛选* @param persons 集合* @return 返回符合两种条件的集合*/@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);       return otherCriteria.meetCriteria(firstCriteriaPersons);}
    }
    
  5. 求两种条件并集
    /*** 两种条件的合集*/
    public class OrCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;/*** 两种条件的合集* @param criteria 筛选集合* @param otherCriteria 筛选集合*/public OrCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria; }@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaItems = criteria.meetCriteria(persons);List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);for (Person person : otherCriteriaItems) {if(!firstCriteriaItems.contains(person)){firstCriteriaItems.add(person);}} return firstCriteriaItems;}
    }
    
4、进行测试
public class Main {public static void main(String[] args) {List<Person> persons = getPerson();//男性Criteria male = new CriteriaMale();//单身Criteria single = new CriteriaSingle();//女性CriteriaFemale criteriaFemale = new CriteriaFemale();//交集  单身男性AndCriteria andCriteria = new AndCriteria(single, male);//并集  单身或者男性OrCriteria orCriteria = new OrCriteria(single, male);printPersons("女性: ", criteriaFemale.meetCriteria(persons));printPersons("单身: ", single.meetCriteria(persons));printPersons("单身男性: ", andCriteria.meetCriteria(persons));printPersons("单身或是男性: ", orCriteria.meetCriteria(persons));}/*** 初始化用户类*/private static List<Person> getPerson() {List<Person> persons = new ArrayList<>();persons.add(new Person("Robert", "男", "单身"));persons.add(new Person("John", "男", "结婚"));persons.add(new Person("Laura", "女", "结婚"));persons.add(new Person("Diana", "女", "单身"));persons.add(new Person("Mike", "男", "单身"));persons.add(new Person("Bobby", "男", "单身"));return persons;}/*** 输出集合** @param persons 集合*/public static void printPersons(String name, List<Person> persons) {System.out.println(name);persons.forEach(person ->System.out.println(person.toString()));}
}
5、测试结果

女性:
Person(name=Laura, gender=女, maritalStatus=结婚)
Person(name=Diana, gender=女, maritalStatus=单身)
单身:
Person(name=Robert, gender=男, maritalStatus=单身)
Person(name=Diana, gender=女, maritalStatus=单身)
Person(name=Mike, gender=男, maritalStatus=单身)
Person(name=Bobby, gender=男, maritalStatus=单身)
单身男性:
Person(name=Robert, gender=男, maritalStatus=单身)
Person(name=Mike, gender=男, maritalStatus=单身)
Person(name=Bobby, gender=男, maritalStatus=单身)
单身或是男性:
Person(name=Robert, gender=男, maritalStatus=单身)
Person(name=Diana, gender=女, maritalStatus=单身)
Person(name=Mike, gender=男, maritalStatus=单身)
Person(name=Bobby, gender=男, maritalStatus=单身)
Person(name=John, gender=男, maritalStatus=结婚)

设计模式之——过滤器模式(Filter Pattern)相关推荐

  1. 设计模式(八)----过滤器模式

    概述 过滤器模式(Filter Pattern),又叫标准模式(Criteria Pattern),是一种结构型模式. 这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们 ...

  2. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:web ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  4. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  5. java 访客模式,设计模式 - 访客模式( Visitor Pattern)

    设计模式 - 访客模式( Visitor Pattern) 在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法. 通过这种方式,元素的执行算法可以随着访问者的变化而变化. 此模式属于行 ...

  6. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  7. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  8. 设计模式-中介者模式(Mediator Pattern)

    设计模式-中介者模式(Mediator Pattern) 文章目录 设计模式-中介者模式(Mediator Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.总 ...

  9. 设计模式之过滤器模式(摘自菜鸟驿站)

    Filter Pattern,允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把他们链接起来,这种设计模式属于结构性设计模式,它结合多个标准来获得单一标准. 创建一个类,在该类上应用 ...

  10. 【愚公系列】2021年12月 二十三种设计模式(七)-桥接模式(Bridge Pattern)

    文章目录 前言 一.桥接模式(Bridge Pattern) 二.使用步骤 角色 示例 总结 优点 缺点 使用场景 前言 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分 ...

最新文章

  1. Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(二)
  2. join 方法代码实例
  3. php gdk,gdk.php
  4. JAVA之private修饰成员方法默认是final型的?
  5. MSDN电子杂志上有关TFS的文章
  6. asp.net mvc 如何在执行完某任务后返回原来页面
  7. 版本管理工具git的使用总结
  8. 抖音网上如何赚钱变现,有哪些具体的方法
  9. Anaconda||install报错:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghu
  10. TensorFlow 2 实现线性回归和非线性回归
  11. 玩客云 装java_玩客云内置 eMMC 存储刷入 armbian
  12. maven--Element ‘resource‘ cannot have character [children], because the type‘s content type is eleme
  13. Matlab模拟傅里叶变换
  14. python多任务,线程详解
  15. LwIP应用笔记(二):无操作系统支持下的RAW API移植
  16. Filter过滤器介绍及使用
  17. 哲理小故事300篇(1—100)
  18. iOS_异常堆栈报告分析
  19. Java合并流实现简单的文件合并示例
  20. [Android Pro] 将你的安卓手机屏幕共享到PC或Mac上

热门文章

  1. SELECT中的多表连接
  2. [HTML/CSS]浮动的那点事儿
  3. numpy中的broadcast
  4. 有监督学习 无监督学习
  5. Memcache 提高缓存命中率
  6. 今天开始用 VSU 2010
  7. lucene使用与优化
  8. 在CentOS 7系统上安装PHP 7.4版本的方法
  9. WLAN中直接转发和隧道转发流程与封装
  10. 计算机网络(HCIP、HCIE)系列文章大合集