• 结构型模式-过滤器模式


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

    1. @AllArgsConstructor
    2. @Data
    3. public class Person {
    4. private String name;
    5. private String gender;
    6. private String maritalStatus;
    7. }
    1. public interface Criteria {
    2. List meetCriteria(List persons);
    3. }
    1. @AllArgsConstructor
    2. public class AndCriteria implements Criteria{
    3. private final Criteria criteria;
    4. private final Criteria otherCriteria;
    5. @Override
    6. public List meetCriteria(List persons) {
    7. List firstCriteriaPersons = criteria.meetCriteria(persons);
    8. return otherCriteria.meetCriteria(firstCriteriaPersons);
    9. }
    10. }
    1. public class CriteriaFemale implements Criteria{
    2. @Override
    3. public List meetCriteria(List persons) {
    4. List femalePersons = new ArrayList();
    5. for (Person person : persons) {
    6. if(person.getGender().equalsIgnoreCase("FEMALE")){
    7. femalePersons.add(person);
    8. }
    9. }
    10. return femalePersons;
    11. }
    12. }
    1. public class CriteriaMale implements Criteria{
    2. @Override
    3. public List meetCriteria(List persons) {
    4. List malePersons = new ArrayList();
    5. for (Person person : persons) {
    6. if(person.getGender().equalsIgnoreCase("MALE")){
    7. malePersons.add(person);
    8. }
    9. }
    10. return malePersons;
    11. }
    12. }
    1. public class CriteriaSingle implements Criteria{
    2. @Override
    3. public List meetCriteria(List persons) {
    4. List singlePersons = new ArrayList();
    5. for (Person person : persons) {
    6. if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
    7. singlePersons.add(person);
    8. }
    9. }
    10. return singlePersons;
    11. }
    12. }
    1. @AllArgsConstructor
    2. public class OrCriteria implements Criteria{
    3. private final Criteria criteria;
    4. private final Criteria otherCriteria;
    5. @Override
    6. public List meetCriteria(List persons) {
    7. List firstCriteriaItems = criteria.meetCriteria(persons);
    8. List otherCriteriaItems = otherCriteria.meetCriteria(persons);
    9. for (Person person : otherCriteriaItems) {
    10. if (!firstCriteriaItems.contains(person)){
    11. firstCriteriaItems.add(person);
    12. }
    13. }
    14. return firstCriteriaItems;
    15. }
    16. }
    1. @Test
    2. public void test1(){
    3. List persons = new ArrayList();
    4. persons.add(new Person("Robert","Male","Single"));
    5. persons.add(new Person("John","Male", "Married"));
    6. persons.add(new Person("Laura","Female", "Married"));
    7. persons.add(new Person("Diana","Female", "Single"));
    8. persons.add(new Person("Mike","Male", "Single"));
    9. persons.add(new Person("Bobby","Male", "Single"));
    10. Criteria male = new CriteriaMale();
    11. Criteria female = new CriteriaFemale();
    12. Criteria single = new CriteriaSingle();
    13. Criteria singleMale = new AndCriteria(single, male);
    14. Criteria singleOrFemale = new OrCriteria(single, female);
    15. System.out.println("Males: ");
    16. //因为多态的原因,在多实现类中能找到具体使用哪个类的实现方法
    17. printPersons(male.meetCriteria(persons));
    18. System.out.println("\nFemales: ");
    19. printPersons(female.meetCriteria(persons));
    20. System.out.println("\nSingle Males: ");
    21. printPersons(singleMale.meetCriteria(persons));
    22. System.out.println("\nSingle Or Females: ");
    23. printPersons(singleOrFemale.meetCriteria(persons));
    24. }
    25. private void printPersons(List persons){
    26. for (Person person : persons) {
    27. System.out.println("Person : [ Name : " + person.getName()
    28. +", Gender : " + person.getGender()
    29. +", Marital Status : " + person.getMaritalStatus()
    30. +" ]");
    31. }
    32. }

    结果:

    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 ]

     

  • 相关阅读:
    【Vue面试题四】、Vue实例挂载的过程中发生了什么?
    比较研究测井预测:遗传算法与神经网络(Matlab代码实现)
    100天精通Python——第47天:selenium自动化操作浏览器
    LeetCode 2034. 股票价格波动:哈希表 + 有序集合
    【java】Lambda表达式
    在vue2中使用饼状图
    OpenCL编程指南-10.2使用C++包装器API的矢量相加示例
    有源电力滤波器在地铁站低压配电系统中的应用分析
    一心为农,以智取胜——张继群的智慧农业之路
    【PAT乙级】1015 德才论
  • 原文地址:https://blog.csdn.net/weixin_44233087/article/details/132747717