责任链模式是将多个对象连接成一条链,同时这些对象都能接收客户端请求,目的是避免请求发送者与接收者耦合在一起,请求会沿着这条链传递请求,直到有对象处理它为止。
文章目录
责任链模式一、责任链模式主要解决了哪些场景?二、以公司采购举例
1.代码如下:2.运行结果 总结
一、责任链模式主要解决了哪些场景?
有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
公司采购流程审批,不同价钱的采购物品由不同的领导进行审批。
邮件审批,不同类型的邮件交给不同领导进行审批。
二、以公司采购举例 1.代码如下:建立请求类
//请求类 public class PurchaseRequest { private int type = 0; //请求类型 private float price = 0.0f; //请求金额 private int id = 0; //构造器 public PurchaseRequest(int type, float price, int id) { this.type = type; this.price = price; this.id = id; } public int getType() { return type; } public float getPrice() { return price; } public int getId() { return id; } }
建立审批人抽象类
public abstract class Approver { Approver approver; //处理者 String name; // 名字 public Approver(String name) { this.name = name; } //下一个处理者 public void setApprover(Approver approver) { this.approver = approver; } //处理审批请求的方法,得到一个请求, 处理是子类完成,因此该方法做成抽象 public abstract void processRequest(PurchaseRequest purchaseRequest);
依次建立主管、经理、董事长审批类
public class DirectorApprover extends Approver{ public DirectorApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { if(purchaseRequest.getPrice() <= 5000) { System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理"); }else { approver.processRequest(purchaseRequest); } } }
public class GeneralManagerApprover extends Approver{ public GeneralManagerApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { if(purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 30000) { System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理"); }else { approver.processRequest(purchaseRequest); } } }
public class ChairmanApprover extends Approver{ public ChairmanApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { if(purchaseRequest.getPrice() > 30000) { System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理"); }else { approver.processRequest(purchaseRequest); } } }
建立client测试
public class AtClient { public static void main(String[] args) { PurchaseRequest purchaseRequest = new PurchaseRequest(2, 10000, 2222); //创建相关的审批人 DirectorApprover directorApprover = new DirectorApprover("李主管"); GeneralManagerApprover generalManagerApprover = new GeneralManagerApprover("张总经理"); ChairmanApprover chairmanApprover = new ChairmanApprover("董事长"); directorApprover.setApprover(generalManagerApprover); generalManagerApprover.setApprover(chairmanApprover); chairmanApprover.setApprover(directorApprover); directorApprover.processRequest(purchaseRequest); generalManagerApprover.processRequest(purchaseRequest); } }2.运行结果
结果如下:
id= 2222 被 张总经理 处理 id= 2222 被 张总经理 处理总结
优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点:
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)