快速引入
责任链模式,首先肯定是一条链,然后链上每个节点都有他的责任,任务在链上传递,假设从第一个开始传递,传递到下一个时候如果他有责任处理这个事情就处理,没责任,或者不能处理就传递下去,依次这样。直到传到最后一个或者事情被处理完。这个非常好理解,跟日常公司中报销一样,如果你要报销5w,如果你的直接领导没权限报5w,就会转交给经理,经理没有就转给总经理,总经理没有就转到老板,然后批复。
实战
就拿上面的例子来做实战,熟悉下载代码中是怎么实现的
首先得上面个个角色都可以抽象成为一个领导的抽象类
public abstract class Leader {
protected Leader nextHandler;// 本级领导的上一级
// money为需要报账的钱
public final void handleRequest(int money) {
// 如果需要报账的钱小于自身能批的就处理。否则转发给上头
if (money <= limit()) {
handle(money);
} else if (nextHandler != null) {
nextHandler.handleRequest(money);
}
}
//自己能处理的金额上限
public abstract int limit();
//处理
public abstract void handle(int money);
}
然后定义各个具体领导者
public class Director extends Leader{
@Override
public int limit() {
// TODO Auto-generated method stub
return 1000;
}
@Override
public void handle(int money) {
// TODO Auto-generated method stub
System.out.println("主管已处理你的请求");
}
}
public class Manager extends Leader{
@Override
public int limit() {
// TODO Auto-generated method stub
return 20000;
}
@Override
public void handle(int money) {
// TODO Auto-generated method stub
System.out.println("总经理已处理你的请求");
}
}
public class Boss extends Leader{
@Override
public int limit() {
// TODO Auto-generated method stub
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
// TODO Auto-generated method stub
System.out.println("boss已处理你的请求");
}
}
然后调用的时候,先将每个领导的上级设置好
//实例化具体领导者
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
//设置每个领导者的上级
director.nextHandler=manager;
manager.nextHandler=boss;
//发起报账请求,可以从director请求,也可以越过他,在现实生活中这是准许的。
//因为你明知道有些主管报不了,或者主管不在了,你肯定得找上一级
// manager.nextHandler=boss;
director.handleRequest(50000);
总结
我想如果不用设计模式这种来做的话,我们的代码肯定非常难看,你可以自己实践一下,其实学习设计模式我都推崇在学这种模式领会了含义之后,你用自己原来的方式实现一次,再去按照设计模式的思想实现一次,你就会体会他有哪儿好了,很明显所有的设计模式都有的优点解耦、代码灵活,当然最大的缺点你们也看到了,需要一层层传递,如果这个关系链特别长的话,每次请求都挺消耗性能的。