设计模式之过滤器模式

337 阅读3分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。

概念

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

组成角色

过滤器模式有如下角色:

  • 抽象过滤器角色(AbstractFilter):负责定义过滤器的实现接口,具体的实现还要具体过滤器角色去参与,客户端可以调用抽象过滤器角色中定义好的方法,将客户端的所有请求委派到具体的实现类去,从而让实现类去处理;
  • ConcreteFilter(具体过滤器角色):该角色负责具体筛选规则的逻辑实现,最后再返回一个过滤后的数据集合,标准的过滤器只对数据做过滤,当然也可以对集合中的数据做某项处理,再将处理后的集合返回;
  • Subject(被过滤的主体角色):一个软件系统中可以有一个或多个目标角色,在具体过滤器角色中会对指定感兴趣的目标进行处理,以确保后面的数据确实是我想要的。

过滤器模式的特点

  • 可插拔:过滤器的设计概念要求其是支持可插拔设计的;
  • 有序性:过滤器是被设计为一组组的过滤装置,要实现数据过滤,就必须有顺序性要求,比如我们要设计编解码过滤器,用户请求过来的 xml 数据会优先通过 xml2json 过滤器进行数据处理,完了再在响应发出前进行相应的 json2xml 过滤处理,以保证客户端交互以 xml 数据格式为准的同时系统内部数据交互还是维持 json 格式不变;
  • 过滤器的独立性:每种过滤器必须是独立的实体,其状态不受其它过滤器的影响,每个过滤器都有自己独立的数据输入输出接口,只要各个过滤器之间传送的数据遵守共同的规约就可以相连接。

实现

实体

public class Person {
    private String name;//姓名
    private String gender;//性别
    private String maritalStatus;//婚姻状态
    ...
    }
    

筛子(Criteria)

先定义基本的筛子,通过组合的方式,组装成新的筛子。总共会有五把筛子

public interface Criteria {
     public List<Person> meetCriteria(List<Person> persons);
}
/**实现类**/
 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;
​
}
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;
    }

过滤器模式的优缺点

过滤器模式的优点:

1、高内聚、低耦合;2、多过滤器简单合成;3、功能模块重用;4、便于维护;5、支持特定分析;6、支持并行操作

过滤器模式的缺点:

1、导致系统成批操作;2、需协调数据流;3、性能下降,实现复杂