定义
职责链模式Chain if Responsibility:使多个对象都有机会处理请求,从而避免请求发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构图![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/38251b3e92477a72da5561ca446e2b22.jpeg)
代码
public class Main {
public static void main(String[] args) {
Handler h1=new ConcreteHandler1();
Handler h2=new ConcreteHandler2();
Handler h3=new ConcreteHandler3();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
int[] requests={2,5,14,22,18,3,27,20};
for(int request:requests){
h1.HandlerRequest(request);
}
}
}
//Handler类,定义一个处理请示的接口
abstract class Handler{
protected Handler successor;
//设置继任者
public void setSuccessor(Handler successor){
this.successor=successor;
}
//处理请求的抽象方法
public abstract void HandlerRequest(int request);
}
//ConcreteHandler类,具体处理类,处理它所负责的请求,可访问它的后继者,如果可处理该请求则处理,否则转发给它的后继者
class ConcreteHandler1 extends Handler{
@Override
public void HandlerRequest(int request) {
//0-10,处理该请求
if(request>=0&&request<10){
System.out.println(this.getClass().getName()+" 处理请求 "+request);
}
else if(successor!=null){
successor.HandlerRequest(request);
}
}
}
//ConcreteHandler2类,10-20,如果可处理该请求则处理,否则转发给它的后继者
class ConcreteHandler2 extends Handler{
@Override
public void HandlerRequest(int request) {
if(request>=10&&request<20){
System.out.println(this.getClass().getName()+" 处理请求 "+request);
}
else if(successor!=null){
successor.HandlerRequest(request);
}
}
}
//ConcreteHandler3类,20-30,如果可处理该请求则处理,否则转发给它的后继者
class ConcreteHandler3 extends Handler{
@Override
public void HandlerRequest(int request) {
if(request>=20&&request<30){
System.out.println(this.getClass().getName()+" 处理请求 "+request);
}
else if(successor!=null){
successor.HandlerRequest(request);
}
}
}
职责链的好处
使接收者和发送者都没有对方的明确信息,且链中的对象 自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。
可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
不过也要当心,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而没有得到处理。