职责链模式
1.模式动机与定义
模式动机
辅导员、系主任、院长、校长都可以处理奖学金申请表,他们构成一个处理申请表的链式结构,申请表沿着这条链进行传递,这条链就称为职责链职责链
可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求
模式定义
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
对象行为型模式
2.模式结构与分析
模式结构
职责链模式包含如下角色
- Handler:抽象处理者:抽象处理者定义了一个请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是处理者,因此定义了一个自类型的对象,作为其对下家的引用,通过这个引用,处理者可以连成一条链。
- ConcreteHandler: 具体处理者:具体处理者是抽象处理者的子类,可以处理用户请求,再具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限。如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。
- Client: 客户类:客户类用于向链中的对象提出最初的请求,客户类只需要关心链的源头,而无需关心请求的处理细节以及请求的传递过程。
模式分析
//抽象处理者示例代码
public abstract class Handler {
//维持对下家的引用
protected Handler successor;
public void setSuccessor(Handler successor){
this.successor=successor;
}
public abstract void handleRequest(String request);
}
//具体处理者示例代码
public class ConcreteHandler extends Handler{
public void handleRequest(String request){
if(请求满足条件){
//处理请求
}
}
else{
this.successorhandleRequest(request);//转发请求
}
}
- 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链
- 请求在这条链上传递,直到链上的某一个对象处理此请求为止。
- 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
3.模式效果与应用
优点
- 使得一个对象无须知道是其他哪一个对象处理其请求,降低了系统的耦合度
- 可简化对象之间的相互连接
- 给对象职责的分配带来更多的灵活性
- 增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可
缺点
- 不能保证请求一定会被处理
- 对于比较长的职责链,系统性能将受到一定影响,在进行代码调试时不太方便
- 如果建链不当,可能会造成循环调用,将导致系统陷入死循环
使用情况
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
- 可动态指定一组对象处理请求
模式扩展
纯与不纯的职责链模式
一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:一个是承担责任,另一个是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。
在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。
浙公网安备 33010602011771号