一、什么是职责链模式?
职责链模式:(Chain of Responsibility) :使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
类型:形为型模式
顺口溜:中访策备迭 观模命状职解
职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。
链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。
二、职责链模式UML
三、JAVA代码实现
package com.amosli.dp.behavior.cor;
public abstract class Handler {
protected Handler handler;
public void setSuccessor(Handler handler) {
this.handler = handler;
}
public abstract void handleRequest(int request);
}
package com.amosli.dp.behavior.cor;
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(int request) {
if (request < 0) {
System.out.println("request is null");
} else if (handler != null) {
handler.handleRequest(request);
}
}
}
package com.amosli.dp.behavior.cor;
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("so,0<=request<10");
} else if (handler != null) {
handler.handleRequest(request);
}
}
}
package com.amosli.dp.behavior.cor;
public class ConcreteHandler3 extends Handler {
@Override
public void handleRequest(int request) {
if (request>=10) {
System.out.println("so,request>=10");
} else if (handler != null) {
handler.handleRequest(request);
}
}
}
package com.amosli.dp.behavior.cor;
public class Client {
public static void main(String[] args) {
ConcreteHandler1 h1 = new ConcreteHandler1();
ConcreteHandler2 h2 = new ConcreteHandler2();
ConcreteHandler3 h3 = new ConcreteHandler3();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
h1.handleRequest(20);
}
}
四、使用场景
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
可动态指定一组对象处理请求。
五、优缺点
1、优点
1 ) 降低耦合度 :该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。
2) 职责链可简化对象的相互连接 : 结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
3) 增强了给对象指派职责( R e s p o n s i b i l i t y )的灵活性 :当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
4)增加新的请求处理类很方便
2、缺点
1) 不能保证请求一定被接收。既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。
2) 系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
3)当这个链结构比较长,比较复杂的话,会产生很多的内存垃圾对象。
六、源码地址
本系列文章源码地址,https://github.com/amosli/dp 欢迎Fork & Star !!