拦截过滤器模式(Intercepting Filter Pattern)

顾名思义在执行目标操作之前的一些检查和拦截。

拦截过滤器模式的实例

首先实现两个拦截器,一个用于鉴权,一个用于记录日志。

  1. class AuthenticationFilter {
  2. execute(request){
  3. console.log("Authenticating request: " + request);
  4. }
  5. }
  6. class DebugFilter {
  7. execute(request){
  8. console.log("request log: " + request);
  9. }
  10. }

定义我们目标执行方法。

  1. class Target {
  2. execute(request){
  3. console.log("Executing request: " + request);
  4. }
  5. }

定义拦截器的链

  1. class FilterChain {
  2. constructor() {
  3. this.filters = [];
  4. }
  5. addFilter(filter){
  6. this.filters.push(filter);
  7. }
  8. execute(request){
  9. for (let filter of this.filters) {
  10. filter.execute(request);
  11. }
  12. this.target.execute(request);
  13. }
  14. setTarget(target){
  15. this.target = target;
  16. }
  17. }

添加拦截器的管理器

  1. class FilterManager {
  2. constructor(target){
  3. this.filterChain = new FilterChain();
  4. this.filterChain.setTarget(target);
  5. }
  6. setFilter(filter){
  7. this.filterChain.addFilter(filter);
  8. }
  9. filterRequest(request){
  10. this.filterChain.execute(request);
  11. }
  12. }

定义请求的客户端

  1. class Client {
  2. setFilterManager(filterManager){
  3. this.filterManager = filterManager;
  4. }
  5. sendRequest(request){
  6. this.filterManager.filterRequest(request);
  7. }
  8. }

通过给拦截器管理增加目标函数和过滤器后使用客户端请求

  1. const filterManager = new FilterManager(new Target());
  2. filterManager.setFilter(new AuthenticationFilter());
  3. filterManager.setFilter(new DebugFilter());
  4. const client = new Client();
  5. client.setFilterManager(filterManager);
  6. client.sendRequest("HOME");

拦截过滤器模式的优势

首先要完成一个拦截器只需要关心需要实现的接口,只需要关心和其它拦截器的先后关系,这也算是对拦截器和拦截器之间的解耦。其次在执行目标函数的拦截器也不需要关心目标操作的结果和关系。