设计模式(27)-----结构型模式-----过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

实现

我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。

步骤 1

创建一个类,在该类上应用标准

package com.DesignPatterns.Filter;

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;
    }
 }

步骤 2

为标准(Criteria)创建一个接口。

package com.DesignPatterns.Filter;

import java.util.List;
/**
 *
 * @date 2018年11月7日
 * @version 10.28版本
 * @说明:规则统一接口
 */
public interface Criteria {
   public List<Person> meetCriteria(List<Person> persons);
}

步骤 3

创建实现了 Criteria 接口的实体类。

package com.DesignPatterns.Filter;

import java.util.ArrayList;
import java.util.List;

/**
 * @date 2018年11月7日
 * @version 10.28版本
 * @说明:男生类
 */
public class CriteriaMale implements Criteria {

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> malePersons = new ArrayList<Person>();
      for (Person person : persons) {
         if(person.getGender().equalsIgnoreCase("MALE")){
            malePersons.add(person);
         }
      }
      return malePersons;
   }
}
package com.DesignPatterns.Filter;

import java.util.ArrayList;
import java.util.List;
 /**
  *
  * @date 2018年11月7日
  * @version 10.28版本
  * @说明:女生类
  */
public class CriteriaFemale implements Criteria {

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> femalePersons = new ArrayList<Person>();
      for (Person person : persons) {
         if(person.getGender().equalsIgnoreCase("FEMALE")){
            femalePersons.add(person);
         }
      }
      return femalePersons;
   }
}
package com.DesignPatterns.Filter;

import java.util.ArrayList;
import java.util.List;

/**
 * @date 2018年11月7日
 * @version 10.28版本
 * @说明:单身类
 */
public class CriteriaSingle implements Criteria {

   @Override
   public List<Person> meetCriteria(List<Person> persons) {
      List<Person> singlePersons = new ArrayList<Person>();
      for (Person person : persons) {
         if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
            singlePersons.add(person);
         }
      }
      return singlePersons;
   }
}
package com.DesignPatterns.Filter;

import java.util.List;

/**
 * @date 2018年11月7日
 * @version 10.28版本
 * @说明:or单身或者女生 单身或者男生
 */
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> firstCriteriaItems = criteria.meetCriteria(persons);
        List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);

        for (Person person : otherCriteriaItems) {
            if (!firstCriteriaItems.contains(person)) {
                firstCriteriaItems.add(person);
            }
        }
        return firstCriteriaItems;
    }
}
package com.DesignPatterns.Filter;

import java.util.List;
/**
 * @date 2018年11月7日
 * @version 10.28版本
 * @说明:add  单身男生,单身女生
 */
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> firstCriteriaPersons = criteria.meetCriteria(persons);
      return otherCriteria.meetCriteria(firstCriteriaPersons);
   }
}

步骤4

使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。

package com.DesignPatterns.Filter;

import java.util.ArrayList;
import java.util.List;

public class CriteriaPatternDemo {
   public static void main(String[] args) {
      List<Person> persons = new ArrayList<Person>();

      persons.add(new Person("Robert","Male", "Single"));
      persons.add(new Person("John","Male", "Married"));
      persons.add(new Person("Laura","Female", "Married"));
      persons.add(new Person("Diana","Female", "Single"));
      persons.add(new Person("Mike","Male", "Single"));
      persons.add(new Person("Bobby","Male", "Single"));

      Criteria male = new CriteriaMale();
      Criteria female = new CriteriaFemale();
      Criteria single = new CriteriaSingle();
      Criteria singleMale = new AndCriteria(single, male);
      Criteria singleOrFemale = new OrCriteria(single, female);

      System.out.println("Males男生: ");
      printPersons(male.meetCriteria(persons));

      System.out.println("\nFemales女生: ");
      printPersons(female.meetCriteria(persons));

      System.out.println("\nSingle Males 单身男生: ");
      printPersons(singleMale.meetCriteria(persons));

      System.out.println("\nSingle Or Females 单身或者女生: ");
      printPersons(singleOrFemale.meetCriteria(persons));
   }

   public static void printPersons(List<Person> persons){
      for (Person person : persons) {
         System.out.println("Person : [ Name : " + person.getName()
            +", Gender : " + person.getGender()
            +", Marital Status : " + person.getMaritalStatus()
            +" ]");
      }
   }
}

结果:

Males男生:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : John, Gender : Male, Marital Status : Married ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

Females女生:
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]

Single Males 单身男生:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

Single Or Females 单身或者女生:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]

过滤模式的实现在java8里面有典型的应用方法就是分组操作,可以根据指定的指标进行分组筛选。

Map<Integer, List<Person >> groupMap = persons.stream().collect(Collectors.groupingBy(Person::getGender));
groupMap.forEach((k, v) -> {
    System.out.println(k);
    v.forEach(System.out::println);
});

得到的结果形式就是:

  • k:是分组的指标,上面代码中的 gender
  • v:是一个list的集合对象,就是 personList

原文地址:https://www.cnblogs.com/qingruihappy/p/9921833.html

时间: 2024-12-28 00:56:16

设计模式(27)-----结构型模式-----过滤器模式的相关文章

&quot;围观&quot;设计模式(15)--结构型之桥梁模式(Bridge Pattern)

桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为.具体特征分离开来,使它们可以各自独立的变化.事物对象仅是一个抽象的概念.如"圆形"."三角形"归于抽象的"形状"之下,而"画圆"."画三角"归于实现行为的"画图"类之下,然后由"形状"调用"画图".----WIKIPEDIA 个人理解 桥梁模式的核心在于解耦,通过抽象化将具体的事物

&quot;围观&quot;设计模式(14)--结构型之外观模式(Facade Pattern)

外观模式(Facade pattern),是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用.----WIKIPEDIA 个人理解 当一个项目中出现比较杂乱的调用关系时,类与类之间的耦合关系过于复杂,为了降低耦合度,我们可以采用一个公共的接口与其他类发生耦合,这样可以尽量大的降低外界与该系统的耦合度,同时降低了整个系统的复杂度,外观模式相当于一个公共的入口一样,为使用者敞开大门,暴漏一些必要的接口,方便外界进行调用.通俗来讲就是,有多个不同的类

&quot;围观&quot;设计模式(12)--结构型之代理模式(Proxy Pattern)

维基百科 代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式. 所谓的代理者是指一个类可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.内存中的大对象.文件或其它昂贵或无法复制的资源.----WIKIPEDIA 个人理解 代理模式就是找另外的一个对象作为代理去为你实施请求,代理模式分为两种,一种是静态代理模式,另外一种是动态代理模式,静态代理模式是代理类为其创建一个对象,将需要代理的类的对象赋予代理类中的该对象,让代理类中该对象去代替需要代理的类的对象去执行一定的

【设计模式】-结构型-7-组合模式

主要角色 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为.在透明式的组合模式中抽象构件还声明访问和管理子类的接口:在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口. 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点.它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 A

【设计模式】-结构型-2-适配器模式

主要角色 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者. 代码展示 package adapter; //目标接口 interface Target { public void request(); } //适配者接口 class Adaptee { public

【设计模式】-结构型-5-外观模式

主要角色 外观(Facade)角色:为多个子系统对外提供一个共同的接口. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它. 客户(Client)角色:通过一个外观角色访问各个子系统的功能. 代码展示 package facade; public class FacadePattern { public static void main(String[] args) { Facade f=new Facade(); f.method(); } } //外观角色

&quot;围观&quot;设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)

设计模式代码下载地址 设计模式代码下载地址 1  适配器模式 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对

Java学习--设计模式之结构型模式(二)

一.装饰器模式(Decorator Pattern) 1.概念 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 2.简介 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引

设计模式(28)-----结构型模式-----享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象.这里只有5个对象的. 介绍 意图:运用共享技术有效地支持大量细粒度的对象. 主