拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。
过滤器链(Filter Chain) - 过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。
Target - Target 对象是请求处理程序。
过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链。
客户端(Client) - Client 是向 Target 对象发送请求的对象。
首先实现两个拦截器,一个用于鉴权,一个用于记录日志。
class AuthenticationFilter {
execute(request){
console.log("Authenticating request: " + request);
}
}
class DebugFilter {
execute(request){
console.log("request log: " + request);
}
}
定义我们目标执行方法。
class Target {
execute(request){
console.log("Executing request: " + request);
}
}
定义拦截器的链
class FilterChain {
constructor() {
this.filters = [];
}
addFilter(filter){
this.filters.push(filter);
}
execute(request){
for (let filter of this.filters) {
filter.execute(request);
}
this.target.execute(request);
}
setTarget(target){
this.target = target;
}
}
添加拦截器的管理器
class FilterManager {
constructor(target){
this.filterChain = new FilterChain();
this.filterChain.setTarget(target);
}
setFilter(filter){
this.filterChain.addFilter(filter);
}
filterRequest(request){
this.filterChain.execute(request);
}
}
定义请求的客户端
class Client {
setFilterManager(filterManager){
this.filterManager = filterManager;
}
sendRequest(request){
this.filterManager.filterRequest(request);
}
}
通过给拦截器管理增加目标函数和过滤器后使用客户端请求
const filterManager = new FilterManager(new Target());
filterManager.setFilter(new AuthenticationFilter());
filterManager.setFilter(new DebugFilter());
const client = new Client();
client.setFilterManager(filterManager);
client.sendRequest("HOME");
首先要完成一个拦截器只需要关心需要实现的接口,只需要关心和其它拦截器的先后关系,这也算是对拦截器和拦截器之间的解耦。其次在执行目标函数的拦截器也不需要关心目标操作的结果和关系。