设计模式之职责链模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
当我写一个请假审批的时候,它首先到部门经理,再到总监,再到总经理,根据需求不同。
它和普通的判断的最大区别就是普通判断你将会把所有引用都放到一个方法,这样这个方法就回很庞大,耦合度很高,当我们分开去判断(每个类只需要包含她所需要的下一个引用)耦合度就回降低。
而且结构连是在客户端定义的,部门经理想跳过总监到总经理只需要简单改下就行。
代码:
//管理者
public abstract class Director {
protected Director director;
public Director getDirector() {
return director;
}
public void setDirector(Director director) {
this.director = director;
}
//管理者处理请求
public abstract void HandlerRequest(Integer time);
}
//部门经理
public class BumenJingli extends Director {
@Override
public void HandlerRequest(Integer time) {
if (time<4){
System.out.println("部门经理同意");
}else {
super.director.HandlerRequest(time);
}
}
}
//总监
public class Zongjian extends Director {
@Override
public void HandlerRequest(Integer time) {
if (time <7){
System.out.println("总监同意");
}else {
super.director.HandlerRequest(time);
}
}
}
//总经理
public class Zongjingli extends Director {
@Override
public void HandlerRequest(Integer time) {
if (time>30){
System.out.println("总经理不同意");
}else {
System.out.println("总经理同意");
}
}
}
//测试客户端
public class Test {
public static void main(String[] args) {
Director zongjingli = new Zongjingli();
Director zongjian = new Zongjian();
Director bumenjingli = new BumenJingli();
//部门经理 -- 总监 --总经理
bumenjingli.setDirector(zongjian);
zongjian.setDirector(zongjingli);
bumenjingli.HandlerRequest(2);
bumenjingli.HandlerRequest(5);
bumenjingli.HandlerRequest(10);
bumenjingli.HandlerRequest(40);
//经理知道我真的有急事要请假40天,夸过总监直接让经理找总经理
//修改链的结构,
//部门经理 --总经理
System.out.println("跨过总监");
bumenjingli.setDirector(zongjingli);
bumenjingli.HandlerRequest(40);
}
}