拦截过滤器模式

基本介绍

1.用于对应用程序的请求或响应做一些预处理 / 后处理,定义过滤器,并在把请求传给实际目标应用程序之前,应用在请求上,过滤器可以做认证 / 授权 / 记录日志,或者跟踪请求,然后把请求传给相应的处理程序

2.角色

(1)Filter:过滤器,在请求处理程序执行请求之前或之后,执行某些任务

(2)Filter Chain:过滤器链,聚合 单 / 多个 Filter,并在 Target 上按照定义的顺序执行这些过滤器

(3)Filter Manager:聚合 Filter Chain,过滤管理器,管理过滤器和过滤器链

(4)Target:请求处理程序

(5)Client:客户端,向 Target 对象发送请求的对象

 

代码示例

import java.util.ArrayList;
import java.util.List;

public class InterceptingFilter {//客户端

    public static void main(String[] args) {
        FilterManager filterManager = new FilterManager(new Target());
        filterManager.addFilter(new AuthenticationFilter());
        filterManager.addFilter(new DebugFilter());
        filterManager.execute("view");
    }
}

class FilterManager {//过滤管理器
    FilterChain filterChain;

    public FilterManager(Target target) {
        filterChain = new FilterChain();
        filterChain.setTarget(target);
    }

    public void addFilter(Filter filter) {
        filterChain.addFilter(filter);
    }

    public void execute(String request) {
        filterChain.execute(request);
    }
}

class FilterChain {//过滤器链
    private List<Filter> filters = new ArrayList<Filter>();
    private Target target;

    public void addFilter(Filter filter) {
        filters.add(filter);
    }

    public void execute(String request) {
        for (Filter filter : filters) {
            filter.execute(request);
        }
        target.execute(request);
    }

    public void setTarget(Target target) {
        this.target = target;
    }
}

interface Filter {//过滤器接口

    public void execute(String request);
}

class AuthenticationFilter implements Filter {//具体过滤器

    public void execute(String request) {
        System.out.println("认证请求:" + request);
    }
}

class DebugFilter implements Filter {//具体过滤器

    public void execute(String request) {
        System.out.println("记录请求日志:" + request);
    }
}

class Target {//请求处理程序

    public void execute(String request) {
        System.out.println("执行请求:" + request);
    }
}

 

posted @   半条咸鱼  阅读(101)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示