情节:请假非要老总批准?
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象做出来处理为止。
结构图:
abstract class Handler {
protected Handler successor;
public Handler getSuccessor() {
return successor;
}
//设置继承者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
//处理请求的抽象方法
public abstract void HandleRequest(int request);
}
public class ConcreteHandler1 extends Handler{
@Override
public void HandleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("A处理请求"+request);
}
else if (successor != null){
successor.HandleRequest(request);
}
}
}
public class ConcreteHandler2 extends Handler{
@Override
public void HandleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("B处理请求"+request);
}
else if (successor != null) {
successor.HandleRequest(request);
}
}
}
public class ConcreteHandler3 extends Handler{
@Override
public void HandleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("C处理请求"+request);
}
else if (successor != null) {
successor.HandleRequest(request);
}
}
}
public class Client {
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,16,7,19,31,10,12,24};
for (int i : requests) {
h1.HandleRequest(i);
}
}
}
职责链模式的优点
• 降低耦合度
• 可简化对象的相互连接
• 增强给对象指派职责的灵活性
• 增加新的请求处理类很方便
职责链模式的缺点
•不能保证请求一定被接收。
•系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
模式适用环境
在以下情况下可以使用职责链模式:
•有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
•在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
•可动态指定一组对象处理请求。