###前言
《亮剑》大家非常熟悉的一部电视剧了,毕竟当年很多电视台都在播放,而且拍的非常不错,得到了广大人
民群众的认可。反正自己偶尔还是会再看一看,这部电视剧自己看了至少不下三遍了。剧中非常熟悉的“二营长,
你…意大利炮呢?”(敏感词屏蔽),这个是发生在李云龙攻打平安县城的时候,不知大家还记不记得攻打之前赵刚劝过说:
“这么大规模的战役,是需要请示上级的”。军队上不同的领导对于自己领导的部队有指挥权,有自己处理事件
的范围,超出了这个范围则需要向上级请示。如果上级还不能处理,那上级再向上级的上级请示。直到能够找
到处理这个事件的领导。这个在设计模式中就是职责链模式了。
###结构图
###代码
以下例子使用公司领导结构例子
/**
* 公司员工抽象类
*/
public abstract class Leader {
protected String name;
protected Leader leader;
public Leader getLeader() {
return leader;
}
public void setLeader(Leader leader) {
this.leader = leader;
}
public Leader() {
}
public Leader(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void dealRequest(Integer day);
}
/**
* 总经理类
*/
public class GeneralManager extends Leader {
@Override
public void dealRequest(Integer day) {
System.out.println(name + "总经理处理了你的这个请求!");
}
}
/**
* 总监类
*/
public class Director extends Leader{
@Override
public void dealRequest(Integer day) {
if (day <= 5) {
System.out.println(name + "总监可以处理这个请求!");
} else {
System.out.println(name + "总监无法处理这个请求!转交" + leader.getName() + "处理");
leader.dealRequest(day);
}
}
}
/**
* 经理类
*/
public class Manager extends Leader {
@Override
public void dealRequest(Integer day) {
if (day <= 2) {
System.out.println(name + "经理可以批准");
} else {
System.out.println(name + " 经理无法处理这个请求!让" + leader.getName() + "总监处理!");
leader.dealRequest(day);
}
}
}
/**
* 员工类
*/
public class Employee {
private String name;
private Leader leader;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Leader getLeader() {
return leader;
}
public void setLeader(Leader leader) {
this.leader = leader;
}
public void leaveRequest(Integer day) {
System.out.println(name + "员工想要请假" + day + "天");
leader.dealRequest(day);
};
}
/**
* 测试类
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
Leader generalManager = new GeneralManager();
generalManager.setName("张三");
Leader director = new Director();
director.setName("李四");
director.setLeader(generalManager);
Leader manager = new Manager();
manager.setLeader(director);
manager.setName("王五");
Employee employee = new Employee();
employee.setLeader(manager);
employee.setName("小小");
for (int i = 1; i < 8; i ++) {
employee.leaveRequest(i);
System.out.println("--------------");
Thread.sleep(2000);
}
}
}
###输出结果
###总结
职责链模式:使多个对象都有机会处理请求,从而避免请求的发起者和处理者之间的耦合关系,将一系列对象串
成一条链子,沿着这条链子传递请求,直到有一个节点处理这个请求。
这个模式要非常注意最后一个节点,最后一个节点至少要能处理所有的请求,不然就会导致请求没人处理,就像
前言中的上级领导一样,如果上级领导不见了,或者被暗杀了,那传递的消息就没人处理,那整个链子就坏了。
在springMVC中,对请求的处理就是一个职责链的模式,HandlerExecutionChain类负责请求的拦截执行和请
求的处理,但是他本身不处理请求,只是将请求分配给在链上注册的处理器执行,这是一种责任链的实现方式,它减少
了责任链本身与处理逻辑之间的耦合的同时,也规范了请求处理的过程。