设计模式之过滤设计模式

一、概念

  • 这种设计模式是允许开发人员使用不同的标准来错率一组对象,通过以逻辑运算以解耦的方式把它们连接起来。

二、场景

  • 认证/授权/日志记录等

三、实现

  • 条件
    • java
  • 场景
    以工厂员工过滤性别,婚姻状态为例实现过滤器模式。
  • 代码
    • 新建员工领域类,类名: User

          package com.FilterPattern; 
          
          public class User {
          
              private int Id;
              private String Name;
              private String Sex;
              private String type;
          
              public String getType() {
                  return type;
              }
          
              public void setType(String type) {
                  this.type = type;
              }
          
          
              public int getId() {
                  return Id;
              }
          
              public String getName() {
                  return Name;
              }
          
              public String getSex() {
                  return Sex;
              }
          
              public void setId(int id) {
                  Id = id;
              }
          
              public void setName(String name) {
                  Name = name;
              }
          
              public void setSex(String sex) {
                  Sex = sex;
              }
          }
      
      
    • 新建抽象类,类名: AbstractFilter

          package com.FilterPattern;
          
          import java.util.List;
            
          public abstract class AbstractFilter {
              public abstract List<User> FilterBySex(List<User> list);
          } 
      
    • 新建男性过滤器,类名: ManFilter 继承 AbstractFilter

          package com.FilterPattern;
          
          import java.util.ArrayList;
          import java.util.List; 
           
          public class ManFilter extends  AbstractFilter {
              @Override
              public List<User> FilterBySex(List<User> list) {
                  List<User> userList = new ArrayList<>();
                  for(User usr : list)
                  {
                      if ("男".equals(usr.getSex()))
                        userList.add(usr);
                  }
                  return userList;
              }
          }
      
      
    • 新建女性过滤器,类名: FemaleFilter 继承 AbstractFilter

          package com.FilterPattern;
          
          import java.util.ArrayList;
          import java.util.List;
           
          public class FemaleFilter  extends  AbstractFilter{
              @Override
              public List<User> FilterBySex(List<User> list)
              {
                  List<User> userList = new ArrayList<>();
                  for (User user : list)
                  {
                      if ("女".equals(user.getSex()))
                          userList.add(user);
                  }
                  return  userList;
              }
          } 
      
    • 新建婚姻状态过滤器,类名: SingleFilter 继承 AbstractFilter

          package com.FilterPattern;
          
          import java.util.ArrayList;
          import java.util.List;
          
           
          public class SingleFilter extends  AbstractFilter{
              @Override
              public List<User> FilterBySex(List<User> list) {
                  List<User> userList = new ArrayList<>();
                  for(User usr : list)
                  {
                      if ("单身".equals(usr.getType()))
                          userList.add(usr);
                  }
                  return userList;
              }
          }
      
      
    • 新建组合类,类名: AndFilter

          package com.FilterPattern; 
          import java.util.ArrayList;
          import java.util.List; 
          public class AndFilter {
              private List<AbstractFilter> listFilters = new ArrayList<>();
              public void  AddFilter (AbstractFilter filter)
              {
                  listFilters.add(filter);
              }
          
              public  List<User> FilterUser(List<User> list)
              {
                  for (AbstractFilter obj : listFilters)
                  {
                      list = obj.FilterBySex(list);
                  }
                 return list;
              }
          } 
      
    • 入口函数类,类名: Main

          List list =new ArrayList<>();
          User user = new  User();
          user.setId(1);
          user.setName("小明");
          user.setSex("男");
          user.setType("单身");
          list.add(user);
      
          user = new  User();
          user.setId(2);
          user.setName("小刚");
          user.setSex("男");
          user.setType("结婚");
          list.add(user);
      
          user = new  User();
          user.setId(3);
          user.setName("小芳");
          user.setSex("女");
          user.setType("单身");
          list.add(user);
      
          user = new  User();
          user.setId(4);
          user.setName("小婷");
          user.setSex("女");
          user.setType("结婚");
          list.add(user);
      
          user = new  User();
          user.setId(5);
          user.setName("小王");
          user.setSex("男");
          user.setType("单身");
          list.add(user);
      
          AndFilter andFilter = new AndFilter();
          andFilter.AddFilter(new FemaleFilter());
          andFilter.AddFilter(new SingleFilter());
          List<User> lisrtUser = andFilter.FilterUser(list);
          //数据输出
          lisrtUser.forEach(usr -> {
              System.out.println(usr.getId()+"------"+usr.getName()+"------"+usr.getSex()+"-----"+usr.getType());
          });    
      

四、优缺点

  • 优点
    • 将对象过滤、校验逻辑抽出来,降低系统的复杂度。
  • 缺点
    • 新增一个过滤条件就得新增一个类,代码的维护量增大。
    • 性能变低,需要遍历集合中数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值