一、概念
- 这种设计模式是允许开发人员使用不同的标准来错率一组对象,通过以逻辑运算以解耦的方式把它们连接起来。
二、场景
- 认证/授权/日志记录等
三、实现
- 条件
- 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()); });
-
四、优缺点
- 优点
- 将对象过滤、校验逻辑抽出来,降低系统的复杂度。
- 缺点
- 新增一个过滤条件就得新增一个类,代码的维护量增大。
- 性能变低,需要遍历集合中数据。