设计模式之责任链模式
责任链模式简介
责任链,顾名思义,由不同的责任承担者构成的链,简单地说,责任链模式就是由不同的责任者构成的链所构成的设计模式,这种模式的特点在于,当一个服务当前对象无法处理的时候,就可以按照指定的下一个处理者来进行处理,直到没有人能够处理为止,这种模式的好处在于,可以动态地将所需要的处理者连接起来,而不是将其硬编码在代码中,这样,当需要调整不同的处理者,比如说增加一个处理者或者减少一个处理者的时候,就比较方便了
责任链模式的具体实现
这里,假设有这样一种情况,当在公司申请钱的时候,少于2000直接由组长审批即可,大于2000小于5000则由经理进行审批,大于5000小于10000的时候,直接Boss进行处理,在没有采用责任链模式的时候,我们会通过分支结构进行处理,如下所示
if(money < 2000){
// group leader
}else if (money < 5000){
// manager
}else if (money < 10000){
// boss
}
这样子有一个不太好的地方就是,如果此时金额超过的10000的时候,希望由董事会进行审批,此时就需要修改该代码了,这样子不可避免就会带来许多不必要的麻烦了
接下来来看下采用责任链模式之后的代码
/**
* 领导类
*/
abstract class Director {
protected Director nextDirector;
public Director(Director nextDirector) {
this.nextDirector = nextDirector;
}
// 处理请求
public abstract void handleRequest(double money);
}
/**
* 组长
*/
class GroupLeader extends Director{
public GroupLeader(Director nextDirector) {
super(nextDirector);
}
@Override
public void handleRequest(double money) {
if (money < 2000){
System.out.printf("Group Leader Handle Money %.2f\n", money);
}else {
if (nextDirector != null){
nextDirector.handleRequest(money);
}
}
}
}
/**
* 经理
*/
class Manager extends Director{
public Manager(Director nextDirector) {
super(nextDirector);
}
@Override
public void handleRequest(double money) {
if (money < 5000){
System.out.printf("Manager Handle Money %.2f\n", money);
}else {
if (nextDirector != null){
nextDirector.handleRequest(money);
}
}
}
}
/**
* Boss
*/
class Boss extends Director{
public Boss(Director nextDirector) {
super(nextDirector);
}
@Override
public void handleRequest(double money) {
if (money < 10000){
System.out.printf("Boss Handle Money %.2f\n", money);
}else {
if (nextDirector != null){
nextDirector.handleRequest(money);
}
}
}
}
// 测试类
class Client{
public static void main(String[] args) {
// 根据需要组合不用的处理者
Director boss = new Boss(null);
Director manager = new Manager(boss);
Director groupLeader = new GroupLeader(manager);
}
}
可以看到,此时将处理者的顺序指定交给了客户端来处理,这样子的好处在于,可以根据业务的需要进行组合处理者,而且,可以将处理顺序编写在配置文件中,这样子,当进行修改的时候就只需要增加新的处理类以及指定其处理顺序,而无需改动原来的代码了
总结
责任链模式的优点在于,可以根据需要动态地指定处理者,而且,将不同的处理者之间的关系分隔来开,使得代码结构更加清晰,更加有利于维护,而且,在需要增加或者减少处理者的时候,减少了对原代码的修改,减少了修改所带来的不必要麻烦