最近在学习《设计模式的艺术》这本书里面讲到了职责链模式,在此写个文章记录一下
职责链模式一种专门用来负责处理链式请求的模式。
职责链模式的引入
在一个采购单处理类中根据采购单金额的不同交给不同的角色来进行处理。
采购单金额<5万元由主任进行处理;采购单金额5万元<=金额<10万元由副董事长进行处理;
10万元<=金额<50万元由董事长进行处理 金额>=50万元由董事会进行处理
Class PurchaseRequestHandler{
public void handle(PurchaseRequest request){
// 主任进行审批
if(request.getAmount() <50000){
this.handlerByDirector(request);
}
// 其余的处理 以此类推
}
//主任审批采购单
public void handleByDirector(PurchaseRequest request){
// 处理代码省略
}
}
由上述代码不能看出当我们需要修改审批的时候,必须要修改源代码的,不符合开闭原则。因此引入了责任链模式用来处理请求。
职责链模式的定义
避免将请求的发送者和接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种行为型模式。
其UML类图如下所示
职责链模式中包含了以下两个角色
(1)Handler(抽象处理者):其中定义了一个抽象方法;还有一个抽象处理者类型的对象successor作为其对后续处理者的引用
(2)ConcreteHandler(具体处理者):实现了抽象处理者中的抽象处理方法作为具体的处理者。
抽象处理者的典型代码如下:
abstract class Handler{
protected Handler successor;
public void setSuccessor(Handler successor){
this.successor = successor;
}
public abstract void handleRequest(String request);
}
具体处理者的代码中主要实现了两个功能(1)处理请求,不同的具体处理者以不同的形式实现抽象处理方法handleRequset();(2)转发请求:如果该请求不属于当前处理方法进行处理,可以将该请求转发给下家。典型代码如下:
class ConcreteHandler extends Handler{
public void handlerRequest(String request){
if(请求满足条件){
//处理请求
}
else{
this.successor.handlerRequest(request); //转发请求
}
}
}
注意:职责链模式的创建工作一般是由客户端来创建的.职责链只负责处理请求和转发请求
职责链的分类
职责链模式可以分为纯的职责链模式和不纯的职责链模式。
纯的职责链模式
一个具体的处理者对象只能有两个行为,要么全部处理,要么交给下家,不存在处理一部分交给下架的情况。
不纯的职责链模式
正好与纯的职责链模式相反,可以处理一部分然后交给下家进行处理。
职责链模式的使用场景
(1)有多个对象处理同一个请求,具体哪个对象处理该请求待运行时刻再确定
(2)在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
(3)可动态的指定一组对象处理请求