21、设计模式(行为型)之责任链模式

xiaoxiao2021-04-16  49

作用

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

何时使用

在处理消息的时候以过滤很多道。

优点

降低耦合度。它将请求的发送者和接收者解耦。简化了对象。使得对象不需要知道链的结构。增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。增加新的请求处理类很方便。

实例

/** * @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); } }

 

关系结构图

转载请注明原文地址: https://www.6miu.com/read-4818101.html

最新回复(0)