在责任链模式中,由每个对象及其下一个对象的引用连接形成一条责任链。客户端发出的请求将在这个链上进行传递。在这个过程中,每个对象可选择处理该事件,或放弃并交由下一级处理,直至处理完毕返回结果。
示例
1.handler父类,定义处理方法
CostHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package org.mamba.handler;
public abstract class CostHandler {
protected CostHandler handler;
public abstract void handleRequest(float money); public void setHandler(CostHandler handler) { this.handler = handler; }
}
|
2.实际处理类(责任链的组成部分)
StuffHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package org.mamba.handler;
public class StaffHandler extends CostHandler {
@Override public void handleRequest(float money) { if (money <= 1000) { System.out.println(money+"申请成功" + this.getClass().getName() + "已处理"); } else { handler.handleRequest(money); }
}
}
|
LeaderHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package org.mamba.handler;
public class LeaderHandler extends CostHandler {
@Override public void handleRequest(float money) { if (money <= 5000) { System.out.println(money+"申请成功" + this.getClass().getName() + "已处理"); } else { handler.handleRequest(money); } }
}
|
BossHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package org.mamba.handler;
public class BossHandler extends CostHandler{
@Override public void handleRequest(float money) { if (money <= 100000) { System.out.println(money+"申请成功" + this.getClass().getName() + "已处理"); } else { System.out.println("拒绝申请!"+ this.getClass().getName() + "已处理"); } }
}
|
3.责任链创建工厂,创建责任链并返回责任链的入口对象
CostHandlerFactory1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package org.mamba.factory;
import org.mamba.handler.BossHandler; import org.mamba.handler.CostHandler; import org.mamba.handler.LeaderHandler; import org.mamba.handler.StaffHandler;
public class CostHandlerFactory {
public static CostHandler createHanlerChain() { CostHandler stuff = new StaffHandler(); CostHandler leader = new LeaderHandler(); CostHandler boss = new BossHandler(); stuff.setHandler(leader); leader.setHandler(boss); return stuff; } }
|
4.请求的对象
ClientRequest1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package org.mamba.client;
import org.mamba.factory.CostHandlerFactory; import org.mamba.handler.CostHandler;
public class ClientRequest { public static void main(String[] args) { CostHandler handler = CostHandlerFactory.createHanlerChain(); handler.handleRequest(500); handler.handleRequest(5000); handler.handleRequest(10000); handler.handleRequest(1000000);
} }
|
输出结果
结果 lang;java1 2 3 4
| "500.0申请成功org.mamba.handler.StaffHandler已处理" "5000.0申请成功org.mamba.handler.LeaderHandler已处理" "10000.0申请成功org.mamba.handler.BossHandler已处理" "拒绝申请!org.mamba.handler.BossHandler已处理"
|
责任链模式的优点:对客户端来说,无需知道是谁处理了它的请求,在结构发生改变的时候,只需要将新的对象加入责任链即可,客户端不用改变依然可以得到返回值。
责任链模式的缺点:由于有多个对象存在这个链中,但多数时候并非所有对象都会被使用,相较于把问题直接提交给对应的对象处理,这样的模式速度更慢。
纯与不纯
如上述例子所述,每个对象仅有两种选择,处理或抛出该问题,每个问题仅会被一个对象处理,则为纯责任链模式。若一个问题在责任链中可以被多个对象处理,则称为不纯的责任链模式。