当前位置:   article > 正文

设计模式之——过滤器模式(Filter Pattern)

过滤器模式

设计模式:

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

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

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

可以提高程序员的思维能力、编程能力和设计能力。
使程序设计更加标准化、代码编制更加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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
2、定义接口
/**
 * 过滤器,进行筛选
 */
public interface Criteria {
   /**
    * 筛选出符合标准的返回
    * @param persons 集合
    * @return 返回符合标准的集合
    */
   List<Person> meetCriteria(List<Person> persons);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
3、实现筛选条件
  1. 筛选出男性
    /**
     * 筛选出男性
     */
    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("男")){
                malePersons.add(person);
             }
          }
          return malePersons;
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  2. 筛选出女性
    /**
     * 筛选出女性
     */
    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("女")){
                femalePersons.add(person);
             }
          }
          return femalePersons;
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  3. 筛选出单身
    /**
     * 过滤单身
     */
    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("单身")){
                singlePersons.add(person);
             }
          }
          return singlePersons;
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  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 返回符合两种条件的集合
        */
       @Override
       public List<Person> meetCriteria(List<Person> persons) {
          List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);       
          return otherCriteria.meetCriteria(firstCriteriaPersons);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  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; 
       }
    
       @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;
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
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())
        );
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
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=结婚)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/482022
推荐阅读
相关标签
  

闽ICP备14008679号