您的位置:首页 > 游戏 > 手游 > 每天一个设计模式之职责链模式(第一天)

每天一个设计模式之职责链模式(第一天)

2024/12/27 19:31:12 来源:https://blog.csdn.net/PaoShan/article/details/140726127  浏览:    关键词:每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师,看他的书我学到了很多东西,从今天开始我要开始更新啦!

在csdn个人博客来总结知识,把他们变成自己的能力。

对三,要不起,张三李四王五几个人在玩斗地主,过过过,一张2 ,其他的都要不起,出了一张4,下家管上。 ---------举个小例子

职责链模式常用于工作流,例如审批单场景,小于五百,管理员审批,大于五百小于3000主管审批,再高些就要老板审批了。

根据此,对应的设计模式就是职责链模式。就是抽象化一个上帝视角的抽象类,由他去判断过不过能不能管上。

上面的是思路,下面就

应用场景:

职责链模式通过建立一条链来组织请求的处理者。
请求将沿着链进行传递,请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。
在软件开发中,如果遇到有多个对象可以处理同一请求时可以应用职责链模式。

是具体的代码实现。大家可以粘贴到本地自己运行的。

1.实体类定义了公共信息

public class PurchaseRequest {private double amount; // 采购金额private int number;    // 采购编号private String purposr;// 采购目的public PurchaseRequest(double amount, int number, String purposr) {this.amount = amount;this.number = number;this.purposr = purposr;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getPurposr() {return purposr;}public void setPurposr(String purposr) {this.purposr = purposr;}
}

2.上帝抽象类

这儿我要解释下,protected可以让继承的子类使用,当前的名字,同时也设置了后继者(下一个节点)的操作人信息,每个人都有自己的抽象处理方法(私有化)

abstract class Approver {protected Approver successor; // 定义后继对象protected String name;          //审批者姓名public Approver(String name) {this.name = name;}// 设置后继者public void setSuccessor(Approver successor){this.successor = successor;};// 抽象请求处理方法public abstract void processRequest(PurchaseRequest request);
}

3.角色类

public class Congress extends Approver{public Congress (String name){super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 100000){System.out.println("副董事长:"+this.name +"申购采批单:"+request.getNumber()+"余额"+request.getAmount()+"元,采购目的:"+request.getPurposr()+"。");}else {this.successor.processRequest(request); // 转发请求}}
}
public class Director extends Approver{public Director (String name){super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 50000){System.out.println("主任:"+this.name +"申购采批单:"+request.getNumber()+"余额"+request.getAmount()+"元,采购目的:"+request.getPurposr()+"。");}else {this.successor.processRequest(request); // 转发请求}}
}
public class President extends Approver{public President(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 500000){System.out.println("董事长:"+this.name +"申购采批单:"+request.getNumber()+"余额"+request.getAmount()+"元,采购目的:"+request.getPurposr()+"。");}else {System.out.println("超过天际了不允许审批");; // 转发请求}}
}

最后的是启动类,符合开闭原则,新增功能节点,不需要修改其他的代码:只需要在职责链路指定下一个节点即可,需要注意的是,最终节点需要写补偿方案

public class test {public static void main(String[] args) {Approver wjzhang,gyang,jguo;wjzhang = new Director("张无忌");  // 主任jguo = new Congress("郭靖");      // 副董事长gyang = new President("杨过");    // 董事长// 创建职责链路wjzhang.setSuccessor(jguo);jguo.setSuccessor(gyang);// 创建采购单PurchaseRequest pr1 = new PurchaseRequest(45000,10001,"倚天屠龙剑");wjzhang.processRequest(pr1);PurchaseRequest pr2 = new PurchaseRequest(60000,10002,"购买屠龙刀");wjzhang.processRequest(pr2);PurchaseRequest pr3 = new PurchaseRequest(160000,10003,"购买九阳真经");wjzhang.processRequest(pr3);PurchaseRequest pr4 = new PurchaseRequest(800000,10004,"购买桃花岛");wjzhang.processRequest(pr4);}
}

最后的结果如下:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com