Java设计模式----过滤器模式(挑三拣四)

过滤器模式

描述

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。

实质(参考过滤器链工作):
原始数据->过滤器1->过滤器2->过滤器3->最终需要的数据

场景

此篇我们以垃圾回收回收为例来描述这一模式
我们需要在一堆垃圾中 选出各种各样的垃圾 来进行分类 然后再过滤出来不是垃圾被回收掉的东西

UML类图

在这里插入图片描述

编码

定义垃圾的属性(拦截器)

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Rubbish {
    private String name;

    private boolean isA;

    private boolean isB;

    private boolean isC;
}

创建一个检查垃圾的接口(拦截器)

public interface CheckRubbish {
    public List<Rubbish> check(List<Rubbish> list);
}

编写有哪几种垃圾(几种拦截器)

public class A implements CheckRubbish {
    @Override
    public List<Rubbish> check(List<Rubbish> list) {
        List<Rubbish> A_list = new ArrayList<>();
        list.forEach(item -> {
            if (item.isA()) {
                A_list.add(item);
            }
        });
        return A_list;
    }
}
public class B implements CheckRubbish {
    @Override
    public List<Rubbish> check(List<Rubbish> list) {
        List<Rubbish> B_List = new ArrayList<>();
        list.forEach(item -> {
            if (item.isB()) {
                B_List.add(item);
            }
        });
        return B_List;
    }
}
public class C implements CheckRubbish {
    @Override
    public List<Rubbish> check(List<Rubbish> list) {
        List<Rubbish> C_List = new ArrayList<>();
        list.forEach(item -> {
            if (item.isC()) {
                C_List.add(item);
            }
        });
        return C_List;
    }
}

测试 : 我们创建一个list(垃圾堆) 用来进行垃圾过滤

public class Test {

    public static void main(String[] args) {
        List<Rubbish> list = new ArrayList<>();
        list.add(new Rubbish("过期香蕉", true, false, false));
        list.add(new Rubbish("过期牛奶", false, false, true));
        list.add(new Rubbish("过期纸巾", false, true, false));
        list.add(new Rubbish("正常牛奶", false, false, false));

        A a = new A();
        B b = new B();
        C c = new C();
        System.out.println("A 垃圾");
        printRubbish(a.check(list));
        System.out.println("B 垃圾");
        printRubbish(b.check(list));
        System.out.println("C 垃圾");
        printRubbish(c.check(list));

    }

    private static void printRubbish(List<Rubbish> list){
        list.forEach(System.out::println);
    }
}

垃圾分类:
A 垃圾
Rubbish(name=过期香蕉, isA=true, isB=false, isC=false)
B 垃圾
Rubbish(name=过期纸巾, isA=false, isB=true, isC=false)
C 垃圾
Rubbish(name=过期牛奶, isA=false, isB=false, isC=true)

过滤出来的不是垃圾的:
list.add(new Rubbish("正常牛奶", false, false, false));

发布了19 篇原创文章 · 获赞 6 · 访问量 1971

猜你喜欢

转载自blog.csdn.net/qq_42252844/article/details/104517682