设计模式(十三)——责任链模式

mac2024-01-26  32

上一篇:设计模式(十二)——亨元模式

下一篇:设计模式(十四)——命令模式

一、概述

官方解释:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系 。将这些对象连成一个链,并沿着这条链传递请求,知道有对象处理它为止。)

我的理解:当需求中某个事件处理在"程度(一般用数字表示程度)"上有分别,且"程度处理"上有明显的上下级关系时(即上级可以处理下级的事情,下级不能处理上级的事件),可以考虑使用责任链模式。

参与者:AbstractHandler(抽象处理者)、ConcreteHandler(具体处理者)

类图:

其实,当事件(或请求)处理上有上下级关系时,你永远避免不了这种链式思想,一起来看看吧。

二、代码

代码——责任链:

package mypackage; public class DesignPatternDemo { public static void main(String[] args) { Approver _director,_viceHeadMaster,_headMaster; _director=new Director("小明"); _viceHeadMaster=new ViceHeadMaster("小刚"); _headMaster=new HeadMaster("小亮"); _director.set_Successor(_viceHeadMaster); _viceHeadMaster.set_Successor(_headMaster); PurchaseRequest request=new PurchaseRequest(800, 100, "购买篮球"); _director.processRequest(request); PurchaseRequest request2=new PurchaseRequest(20000, 1, "举办运动会"); _director.processRequest(request2); PurchaseRequest request3=new PurchaseRequest(200000, 1, "购买图书馆"); _director.processRequest(request3); } } class PurchaseRequest{ private double amount; private int number; private String purpose; public PurchaseRequest(double amount, int number, String purpose) { super(); this.amount = amount; this.number = number; this.purpose = purpose; } 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 getPurpose() { return purpose; } public void setPurpose(String purpose) { this.purpose = purpose; } } abstract class Approver { protected Approver successor; protected String name; public Approver(String name){ this.name=name; } public void set_Successor(Approver successor){ this.successor=successor; } public abstract void processRequest(PurchaseRequest request); } class Director extends Approver{ public Director(String name) { super(name); } @Override public void processRequest(PurchaseRequest request) { if(request.getAmount()<1000){ System.out.println("主任姓名: "+this.name+",此次处理的采购金额: "+request.getAmount()); } else { this.successor.processRequest(request); //将请求交给后继者 } } } class ViceHeadMaster extends Approver{ public ViceHeadMaster(String name) { super(name); } @Override public void processRequest(PurchaseRequest request) { if(request.getAmount()<100000){ System.out.println("副校长姓名: "+this.name+",此次处理的采购金额: "+request.getAmount()); } else { this.successor.processRequest(request); //将请求交给后继者 } } } class HeadMaster extends Approver{ public HeadMaster(String name) { super(name); } @Override public void processRequest(PurchaseRequest request) { System.out.println("校长姓名: "+this.name+",此次处理的采购金额: "+request.getAmount()); } }

输出:

主任姓名: 小明,此次处理的采购金额: 800.0 副校长姓名: 小刚,此次处理的采购金额: 20000.0 校长姓名: 小亮,此次处理的采购金额: 200000.0

三、小结

责任链模式要表示的一种思想,即事件处理根据程度不同存在等级关系,一般的事情基层处理者可以处理,重要的事情需要提交给中层处理,最重要的事情则需要提交给上层处理。

第一,实例中为了方便程度之间的比较关系,一般直接int数值比较大小来代表程度高低,并不一定需要这样,比如ide断掉调试时间的"日志级别"显示,就是目录级别间有高低关系,但是不用数值比较。

第二,一般的实例(包括本实例)都是三层事件处理,实际上没有必要一定是三层,可以两层或四层或其他层,一切按需求来。

第三,责任链在做行政项目的时候特别适用,主要是部门领导一级一级的审批这样的。

设计模式只重其意不重其形,最重要的是链式事件处理思想。

 

上一篇:设计模式(十二)——亨元模式

下一篇:设计模式(十四)——命令模式

最新回复(0)