21、设计模式(行为型)之责任链模式
作用
- 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
何时使用
- 在处理消息的时候以过滤很多道。
优点
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
实例
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 16:46
* @Version:
* @Acton: 封裝请假的信息
*/
public class LeaveRquest {
private String empName;
private int leaveDays;
private String reason;
public LeaveRquest(String empName, int leaveDays, String reason) {
this.empName = empName;
this.leaveDays = leaveDays;
this.reason = reason;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 16:48
* @Version:
* @Acton: 审批抽象类
*/
public abstract class Leader {
protected String name; //子类需要用到
protected Leader nextLeader; //责任链上面的下一个对象
public Leader(String name) {
this.name = name;
}
//设置责任链下衣蛾对象
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
/* 处理请求的核心的业务方法 */
public abstract void handlerRequest(LeaveRquest leaveRquest);
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 17:13
* @Version:
* @Acton: 经理
*/
public class Manager extends Leader{
public Manager(String name) {
super(name);
}
@Override
public void handlerRequest(LeaveRquest leaveRquest) {
if (leaveRquest.getLeaveDays() < 10){ //如果是主任审批范围,就主任处理
System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
System.out.println("经理:"+this.name+"审批通过");
} else { //否则另外处理
if(this.nextLeader != null){ //查看后面还有没有人处理
this.nextLeader.handlerRequest(leaveRquest); //有人处理
}
}
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 17:13
* @Version:
* @Acton: 副经理
*/
public class ViceManager extends Leader{
public ViceManager(String name) {
super(name);
}
@Override
public void handlerRequest(LeaveRquest leaveRquest) {
if (leaveRquest.getLeaveDays() < 20){ //如果是主任审批范围,就主任处理
System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
System.out.println("副经理:"+this.name+"审批通过");
} else { //否则另外处理
if(this.nextLeader != null){ //查看后面还有没有人处理
this.nextLeader.handlerRequest(leaveRquest); //有人处理
}
}
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 17:13
* @Version:
* @Acton: 总经理
*/
public class GeneraManager extends Leader{
public GeneraManager(String name) {
super(name);
}
@Override
public void handlerRequest(LeaveRquest leaveRquest) {
if (leaveRquest.getLeaveDays() < 30){ //如果是主任审批范围,就主任处理
System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
System.out.println("总经理:"+this.name+"审批通过");
} else { //否则另外处理
System.out.println(" 你是不是不想干了 ?" + leaveRquest.getEmpName());
}
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 17:06
* @Version:
* @Acton: 主任审批
*/
public class Diractor extends Leader{
public Diractor(String name) {
super(name);
}
@Override
public void handlerRequest(LeaveRquest leaveRquest) {
if (leaveRquest.getLeaveDays() < 3){ //如果是主任审批范围,就主任处理
System.out.println("员工:"+leaveRquest.getEmpName()+",请假:"+leaveRquest.getLeaveDays()+"天"+",理由:"+leaveRquest.getReason());
System.out.println("主任:"+this.name+"审批通过");
} else { //否则另外处理
if(this.nextLeader != null){ //查看后面还有没有人处理
this.nextLeader.handlerRequest(leaveRquest); //有人处理
}
}
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/5 17:22
* @Version:
* @Acton:
*/
public class TestResponOfChainDemo {
public static void main(String[] args){
test1();
}
public static void test1(){
//创建审批者
Leader zl = new Diractor("张良");
Leader hf = new Manager("韩非");
Leader sh = new GeneraManager("始皇");
Leader gn = new ViceManager("盖聂");
//设置责任链
zl.setNextLeader(hf);
hf.setNextLeader(gn);
gn.setNextLeader(sh);
//开始请假操作
LeaveRquest rquest = new LeaveRquest("李斯", 30, "去找赵高");
zl.handlerRequest(rquest);
}
}