设计模式-责任链

209 阅读2分钟

四 责任链模式

《设计模式》中的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一 个对象处理它为止。

个人理解:责任链是一系列对请求具有处理责任的对象组成的链,请求在其中传递,在从责任链中出来后请求已经被处理。

责任链是一种思想,至于请求在责任链中如何被处理,是被单个对象处理,还是被多个对象处理,在责任链中如何传递,由使用者自行确定。

适用范围:

  1. 多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  2. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  3. 可处理一个请求的对象集合应被动态指定。

简单模拟接受Request的token解析过程

责任链.png

抽象接口:

//责任
package Responsbility.Handler;      
​
import Responsbility.Request;
​
public interface Handler {
    void handle(Request request);
}
​
//请求体
package Responsbility;
​
public interface Request {
    String getToken();
}
​

责任处理实体和责任链对象都使用Handler接口

public class ResChain implements Handler {
    LinkedList<Handler> chain=new LinkedList<>();
    @Override
    public void handle(Request request) {
        if(!chain.isEmpty())
            for (Handler handler:this.chain
                 ) {
                handler.handle(request);
            }
        else
            System.out.println("The chain is empty");
    }
    public ResChain addH(Handler handler) {
        this.chain.add(handler);
        return this;
    }
​
    @Override
    public String toString() {
        return "ResChain{" +
                "chain=" + chain +
                '}';
    }
}
​
//协议解析
public class ProtocolAnalysisH implements Handler {
    @Override
    public void handle(Request request) {
        request.getToken();
        System.out.println("Get Protocol");
    }
}
//权限解析
public class PermissionH implements Handler {
    @Override
    public void handle(Request request) {
        request.getToken();
        System.out.println("Permission check");
    }
}
//用户解析
public class AuthorH implements Handler {
    @Override
    public void handle(Request request) {
        request.getToken();
        System.out.println("Get Author = ");
    }
}
​

可以把chain看作是门面模式,chain是对外的接口,request只需要知道chain的对象,而不需要知道内部的实现

可以注意的是chain也是handler的实现,可以,这样可以在链表中插入链表,不同的链表可以定义不同的handler实现,实现不同链表内部自定义的逻辑,我们给最上层的chain提供了几个门面,handler形成了一棵树

类似的处理规则可以自己定义

主函数

public class Main {
    public static void main(String[] args) {
        Request request=new SimpleR("WangJ's Test");
        ResChain resChain=new ResChain();
        ResChain resChain1=new ResChain();
        resChain.addH(new ProtocolAnalysisH()).addH(new PermissionH()).addH(new AuthorH());
        resChain1.addH(resChain).addH(new PermissionH()).addH(new ProtocolAnalysisH());
​
        System.out.println(resChain1);
        resChain1.handle(request);
    }
}
​

执行结果:

ResChain{chain=[ResChain{chain=[Responsbility.Handler.ProtocolAnalysisH@15aeb7ab, Responsbility.Handler.PermissionH@7b23ec81, Responsbility.Handler.AuthorH@6acbcfc0]}, Responsbility.Handler.PermissionH@5f184fc6, Responsbility.Handler.ProtocolAnalysisH@3feba861]} Get Protocol Permission check Get Author = Permission check Get Protocol