责任链模式

责任链模式(Chain of Responsibility)用于实现处理流程的灵活性,体现在可以灵活地增减和排序handler。涉及到两个重要接口Handler和HandlerChain。按照流程的形式,HandlerChain分为线形和环形。Handler按用途还可以称为拦截器和过滤器,JavaEE的Servlet规范定义的Filter就是一种责任链模式。

Handler接口

public interface Handler {
    void process(Request request, Response response, HandlerChain chain);
}

HandlerChain接口

public interface HandlerChain {
    void process(Request request, Response response);
}

Handler实现类

public class PresidentHandler implements Handler {
    @Override
    public void process(Request request, Response response, HandlerChain chain) {
        System.out.println("President perform check");
        chain.process(request,response);
        System.out.println("President give instructions");
    }
}

HandlerChain实现类--线形

public class LineHandlerChain implements HandlerChain {
    private static List<Handler> handlers = new ArrayList<>();
    private static Iterator<Handler> handlerIterator = null;

    static {
        //模拟从配置文件加载handler
        handlers.add(new AHandler());
        handlers.add(new BHandler());
        handlers.add(new CHandler());
        handlerIterator = handlers.iterator();
    }
    @Override
    public void process(Request request, Response response) {
        for (Handler handler : handlers) {
            handler.process(request, response,null);
        }
    }
}

HandlerChain实现类--环形

public class CircleHandlerChain implements HandlerChain{
    private static List<Handler> handlers = new ArrayList<>();
    private static Iterator<Handler> handlerIterator = null;

    static {
        //模拟从配置文件加载handler
        handlers.add(new MayorHandler());
        handlers.add(new GovernorHandler());
        handlers.add(new PresidentHandler());
        handlerIterator = handlers.iterator();
    }

    @Override
    public void process(Request request, Response response) {
        if (handlerIterator.hasNext()){
            Handler handler = handlerIterator.next();
            handler.process(request,response,this);
        }
    }
}

测试

public class Client {
    public static void main(String[] args) {
        HandlerChain chain = new CircleHandlerChain();
        chain.process(new Request(), new Response());
    }
}

 

posted on 2022-03-08 22:02  金满仓  阅读(75)  评论(0)    收藏  举报

导航