基本介绍:
1、目的:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来;
2、实现:制定不同的规则来对一组对象进行过滤,然后对过滤结果进行分组。
场景举例:
有一个手机套餐的例子,过滤出符合要求的手机套餐
代码示例:
/*** 客户的手机套餐*/@Data@AllArgsConstructor@NoArgsConstructorpublic class Consumer implements Serializable {private static final long serialVersionUID = -2830434210628625159L;/*** 姓名*/private String name;/*** 套餐价格*/private Integer price;/*** 套餐流量*/private Integer flow;}
抽象的过滤接口以及接口的两个具体实现类
/*** 抽象过滤器接口*/public interface Filter {/*** 过滤筛选出需要的套餐* @param consumerList 套餐列表* @return 过滤后的套餐列表*/List<Consumer> filterConsumers(List<Consumer> consumerList);}/*** 流量过滤器*/public class FlowFilter implements Filter{@Overridepublic List<Consumer> filterConsumers(List<Consumer> consumerList) {ArrayList<Consumer> consumers = new ArrayList<>();for (Consumer consumer : consumerList) {//过滤出套餐流量1G以上的if (consumer.getFlow()>1000){consumers.add(consumer);}}return consumers;}}/*** 价格过滤器*/public class PriceFilter implements Filter{@Overridepublic List<Consumer> filterConsumers(List<Consumer> consumerList) {ArrayList<Consumer> consumers = new ArrayList<>();for (Consumer consumer : consumerList) {//过滤出套餐价格100以内的if (consumer.getPrice()<100){consumers.add(consumer);}}return consumers;}}
过滤器的调用
public class Client {public static void main(String[] args) {ArrayList<Consumer> list = new ArrayList<>();list.add(new Consumer("PackageOne",38,800));list.add(new Consumer("PackageTwo",50,1200));list.add(new Consumer("PackageThree",200,2000));List<Consumer> consumerList = new FlowFilter().filterConsumers(list);System.out.println("流量过滤结果:");for (Consumer consumer : consumerList) {System.out.println(consumer);}List<Consumer> priceList = new PriceFilter().filterConsumers(list);System.out.println("价格过滤结果:");for (Consumer consumer : priceList) {System.out.println(consumer);}}}
涉及到的角色:
1、 AbstractFilter(抽象过滤器角色):在客户端可以调用它的方法,在抽象过滤器角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的实现类去,传递给相应的实现类对象处理。
2、 ConcreteFilter(具体滤器角色):在客户端可以调用它的方法,在具体滤器角色会对目标对象集合进行逻辑过滤,最后再返回一个过滤后的集合。
3、 Subject(被过滤角色):在软件系统中可以有一个或者多个目标角色,在具体过滤器中会对目标角色进行逻辑处理以查看是否是我想要的。
