大话设计模式笔记(二十一)の职责链模式
程序员文章站
2022-05-28 22:15:12
职责链模式 定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 UML图 好处 当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHandler 对象负责处理它 接收者和发送者都没有对方 ......
职责链模式
定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
uml图
好处
- 当客户提交一个请求时,请求是沿链传递直至有一个 concretehandler 对象负责处理它
- 接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构。结果时职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持他所有的候选者接收者的引用。
- 可以随时的增加或修改一个请求的结构,增强给对象指派职责的灵活性
但需要注意的是:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
举个栗子
员工申请加薪,需要走流程
talk is cheap, show me the code
(屁话少说,放码过来)
/** * 管理者 * created by callmedevil on 2019/12/14. */ public abstract class manager { protected string name; // 上级 protected manager superior; public manager(string name){ this.name = name; } // 设置上级 public void setsuperior(manager superior){ this.superior = superior; } // 申请请求 public abstract void requestapplications(request request); }
/** * 经理 * created by callmedevil on 2019/12/14. */ public class commonmanager extends manager { public commonmanager(string name) { super(name); } @override public void requestapplications(request request) { // 经理的权限可以批准2天内的假期 if ("请假".equals(request.getrequesttype()) && request.getnumber() <= 2) { system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber())); } else { // 其余申请转交上级 if (superior != null) { superior.requestapplications(request); } } } }
/** * 总监 * created by callmedevil on 2019/12/14. */ public class majordomo extends manager { public majordomo(string name) { super(name); } @override public void requestapplications(request request) { // 总监的权限可以批准5天内的假期 if ("请假".equals(request.getrequesttype()) && request.getnumber() <= 5) { system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber())); } else { // 其余申请转交上级 if (superior != null) { superior.requestapplications(request); } } } }
/** * 总经理 * created by callmedevil on 2019/12/14. */ public class generalmanager extends manager { public generalmanager(string name) { super(name); } @override public void requestapplications(request request) { // 总经理可以批准任意天的假期 if ("请假".equals(request.getrequesttype())) { system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber())); } // 加薪在500内,没问题 else if ("加薪".equals(request.getrequesttype()) && request.getnumber() <= 500) { system.out.println(string.format("%s : %s 数量%s 被批准", name, request.getrequestcontent(), request.getnumber())); } // 加薪超过500要考虑一下 else if ("加薪".equals(request.getrequesttype()) && request.getnumber() > 500) { system.out.println(string.format("%s : %s 数量%s 再说吧", name, request.getrequestcontent(), request.getnumber())); } } }
/** * 申请类 * created by callmedevil on 2019/12/14. */ public class request { // 申请级别 private string requesttype; // 申请内容 private string requestcontent; // 数量 private int number; // 省略get set }
public class test { public static void main(string[] args) { commonmanager commonmanager = new commonmanager("中将"); majordomo majordomo = new majordomo("大将"); generalmanager generalmanager = new generalmanager("元帅"); // 设置上级 commonmanager.setsuperior(majordomo); majordomo.setsuperior(generalmanager); request request = new request(); request.setrequesttype("请假"); request.setrequestcontent("不给请假我不干了"); request.setnumber(1); commonmanager.requestapplications(request); // 客户端的申请都是由经理发起的,但实际上决策是谁,客户端不知道 request request2 = new request(); request2.setrequesttype("请假"); request2.setrequestcontent("不给请假我不干了"); request2.setnumber(4); commonmanager.requestapplications(request2); request request3 = new request(); request3.setrequesttype("加薪"); request3.setrequestcontent("不给加薪我不干了"); request3.setnumber(500); commonmanager.requestapplications(request3); request request4 = new request(); request4.setrequesttype("加薪"); request4.setrequestcontent("不给加薪我不干了"); request4.setnumber(1000); commonmanager.requestapplications(request4); } }
运行结果
中将 : 不给请假我不干了 数量1 被批准 大将 : 不给请假我不干了 数量4 被批准 元帅 : 不给加薪我不干了 数量500 被批准 元帅 : 不给加薪我不干了 数量1000 再说吧
上一篇: QQ营销中12条你可能忽视的细节
下一篇: 大话设计模式笔记(二十二)の中介者模式