基本介绍:
    1、目的:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来;
    2、实现:制定不同的规则来对一组对象进行过滤,然后对过滤结果进行分组。

    场景举例:
    有一个手机套餐的例子,过滤出符合要求的手机套餐

    代码示例:

    1. /**
    2. * 客户的手机套餐
    3. */
    4. @Data
    5. @AllArgsConstructor
    6. @NoArgsConstructor
    7. public class Consumer implements Serializable {
    8. private static final long serialVersionUID = -2830434210628625159L;
    9. /**
    10. * 姓名
    11. */
    12. private String name;
    13. /**
    14. * 套餐价格
    15. */
    16. private Integer price;
    17. /**
    18. * 套餐流量
    19. */
    20. private Integer flow;
    21. }

    抽象的过滤接口以及接口的两个具体实现类

    1. /**
    2. * 抽象过滤器接口
    3. */
    4. public interface Filter {
    5. /**
    6. * 过滤筛选出需要的套餐
    7. * @param consumerList 套餐列表
    8. * @return 过滤后的套餐列表
    9. */
    10. List<Consumer> filterConsumers(List<Consumer> consumerList);
    11. }
    12. /**
    13. * 流量过滤器
    14. */
    15. public class FlowFilter implements Filter{
    16. @Override
    17. public List<Consumer> filterConsumers(List<Consumer> consumerList) {
    18. ArrayList<Consumer> consumers = new ArrayList<>();
    19. for (Consumer consumer : consumerList) {
    20. //过滤出套餐流量1G以上的
    21. if (consumer.getFlow()>1000){
    22. consumers.add(consumer);
    23. }
    24. }
    25. return consumers;
    26. }
    27. }
    28. /**
    29. * 价格过滤器
    30. */
    31. public class PriceFilter implements Filter{
    32. @Override
    33. public List<Consumer> filterConsumers(List<Consumer> consumerList) {
    34. ArrayList<Consumer> consumers = new ArrayList<>();
    35. for (Consumer consumer : consumerList) {
    36. //过滤出套餐价格100以内的
    37. if (consumer.getPrice()<100){
    38. consumers.add(consumer);
    39. }
    40. }
    41. return consumers;
    42. }
    43. }

    过滤器的调用

    1. public class Client {
    2. public static void main(String[] args) {
    3. ArrayList<Consumer> list = new ArrayList<>();
    4. list.add(new Consumer("PackageOne",38,800));
    5. list.add(new Consumer("PackageTwo",50,1200));
    6. list.add(new Consumer("PackageThree",200,2000));
    7. List<Consumer> consumerList = new FlowFilter().filterConsumers(list);
    8. System.out.println("流量过滤结果:");
    9. for (Consumer consumer : consumerList) {
    10. System.out.println(consumer);
    11. }
    12. List<Consumer> priceList = new PriceFilter().filterConsumers(list);
    13. System.out.println("价格过滤结果:");
    14. for (Consumer consumer : priceList) {
    15. System.out.println(consumer);
    16. }
    17. }
    18. }

    涉及到的角色:
    1、 AbstractFilter(抽象过滤器角色):在客户端可以调用它的方法,在抽象过滤器角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的实现类去,传递给相应的实现类对象处理。
    2、 ConcreteFilter(具体滤器角色):在客户端可以调用它的方法,在具体滤器角色会对目标对象集合进行逻辑过滤,最后再返回一个过滤后的集合。
    3、 Subject(被过滤角色):在软件系统中可以有一个或者多个目标角色,在具体过滤器中会对目标角色进行逻辑处理以查看是否是我想要的。