总述
最简化的应用场景就是,发送方要发送信息给接收方。但是呢,在信息传输的过程中要经过层层筛选和过滤,这个就是拦截过滤器模式的基本意思了。
就好比你要喝水,但是担心水里不干净,于是安了个净水器,那么从自来水龙头到你的水杯之间,就经过了层层过滤和筛选。
就好像你要乘飞机,从进入航站楼门口到进入机舱之间还要经过层层的安检。
我就举这俩例子来说明拦截过滤器模式的基本思想,我觉得已经很通俗易懂了,你再不明白我就没办法了。
过滤器管理者有啥用呢?
它是负责维护过滤器链条的维修工、包工头、负责人,它负责管理这个过滤器链。你要面对的是不同类型的功能模块,而不是多个同类型的东西,因此要把很多同类型的东西进行统一管理,于是就有了这个过滤器管理者的存在。
怎么理解这个客户端呢?
它是一个隔离层,或者是一个对接的接口。它一边和用户对接,一边和过滤器管理者对接。就好像是常见的图形化操作界面的意思。这是软件设计中层次化的提现,可以让系统结构清晰,功能明确,是非常好的做法。
什么是应用?
我就觉得这个名字起的不好,容易让人理解偏了,我觉得把它叫做消息接收方最恰当,你就按照这个名字去理解才能比较好地理解到。
图示
图示.png我觉得单单靠类图难以直观表达这个模式要做的事情。
类图
类图.png效果
正在对水进行沙土过滤
正在对水进行细菌过滤
正在对水进行虫卵过滤
最终还是喝到了水
Process finished with exit code 0
调用
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
FilterManager manager = new FilterManager();
manager.addFilter(new Filter1());
manager.addFilter(new Filter2());
manager.addFilter(new Filter3());
manager.setReceiver(new Receiver());
OperationClient client = new OperationClient();
client.setManager(manager);
client.inputMessage("水");
}
}
过滤器接口
package com.company;
public interface Filter {
/**
* 执行过滤的方法,是所有过滤器必须要实现的方法。
* @param inputString
*/
public void executeFilt(String inputString);
}
第1个滤镜
package com.company;
public class Filter1 implements Filter {
@Override
public void executeFilt(String inputString) {
System.out.println("正在对" + inputString + "进行沙土过滤");
}
}
第2个滤镜
package com.company;
public class Filter2 implements Filter {
@Override
public void executeFilt(String inputString) {
System.out.println("正在对" + inputString + "进行细菌过滤");
}
}
第3个过滤器
package com.company;
public class Filter3 implements Filter {
@Override
public void executeFilt(String inputString) {
System.out.println("正在对" + inputString + "进行虫卵过滤");
}
}
过滤器管理者
package com.company;
public class FilterManager {
private FilterChain chain;
public FilterManager() {
this.chain = new FilterChain();
}
public void addFilter(Filter aFilter) {
this.chain.addFilter(aFilter);
}
public void setReceiver(Receiver receiver) {
this.chain.setReceiver(receiver);
}
public void proccessMessage(String inputString) {
this.chain.execute(inputString);
}
}
图形化操作层次
package com.company;
public class OperationClient {
private FilterManager manager;
public void setManager(FilterManager manager) {
this.manager = manager;
}
public void inputMessage(String message) {
this.manager.proccessMessage(message);
}
}
过滤器链
package com.company;
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
private List<Filter> filters;
private Receiver receiver;
public FilterChain() {
this.filters = new ArrayList<>();
}
public void setReceiver(Receiver receiver) {
this.receiver = receiver;
}
public void execute(String inputString) {
for (Filter iterator:this.filters) {
iterator.executeFilt(inputString);
}
if (this.receiver != null) {
this.receiver.getMessage(inputString);
}
}
public void addFilter(Filter aFilter) {
this.filters.add(aFilter);
}
}
最终接收端
package com.company;
public class Receiver {
/**
* 接收者最终接收到了经过层层过滤的消息。
* @param inputString
*/
public void getMessage(String inputString) {
System.out.println("最终还是喝到了" + inputString);
}
}
多谢捧场
如果您觉得我的文章有价值,那么赏脸打赏一个,鄙人感激不尽。不过,不打赏看看也是好的,如果有不对的地方,还请您多多指正。
网友评论