四 责任链模式
《设计模式》中的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一 个对象处理它为止。
个人理解:责任链是一系列对请求具有处理责任的对象组成的链,请求在其中传递,在从责任链中出来后请求已经被处理。
责任链是一种思想,至于请求在责任链中如何被处理,是被单个对象处理,还是被多个对象处理,在责任链中如何传递,由使用者自行确定。
适用范围:
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
简单模拟接受Request的token解析过程
抽象接口:
//责任
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