订单,授权,审批,
1. 结构
1. 处理者(Handler)声明了所有具体处理者的通用接口。该接
口通常仅包含单个方法用于请求处理,但有时其还会包含一
个设置链上下个处理者的方法。
2. 基础处理者(Base Handler)是一个可选的类,你可以将所
有处理者共用的样本代码放置在其中。
通常情况下,该类中定义了一个保存对于下个处理者引用的
成员变量。客户端可通过将处理者传递给上个处理者的构造
函数或设定方法来创建链。该类还可以实现默认的处理行为:
确定下个处理者存在后再将请求传递给它。
3. 具体处理者(Concrete Handlers)包含处理请求的实际代码。
每个处理者接收到请求后,都必须决定是否进行处理,以及
是否沿着链传递请求。
处理者通常是独立且不可变的,需要通过构造函数一次性地
获得所有必要地数据。
4. 客户端(Client)可根据程序逻辑一次性或者动态地生成链。
值得注意的是,请求可发送给链上的任意一个处理者,而非
必须是第一个处理者。
2. 示例代码
3. 使用场景
当程序需要使用不同方式处理不同种类请求,而且请求类型
和顺序预先未知时,可以使用责任链模式。
该模式能将多个处理者连接成一条链。接收到请求后,它会
“询问”每个处理者是否能够对其进行处理。这样所有处理
者都有机会来处理请求。
当必须按顺序执行多个处理者时,可以使用该模式。
无论你以何种顺序将处理者连接成一条链,所有请求都会严
格按照顺序通过链上的处理者。
如果所需处理者及其顺序必须在运行时进行改变,可以使用
责任链模式。
如果在处理者类中有对引用成员变量的设定方法,你将能动
态地插入和移除处理者,或者改变其顺序。
4. 优缺点
你可以控制请求处理的顺序。
单一职责原则。你可对发起操作和执行操作的类进行解耦。
开闭原则。你可以在不更改现有代码的情况下在程序中新增处理者。
部分请求可能未被处理。
5. 模式之间关系
• 责任链、命令、中介者和观察者用于处理请求发送者和接收者之间的不同连接方式:
◦ 责任链按照顺序将请求动态传递给一系列的潜在接收者,
直至其中一名接收者对请求进行处理。
◦ 命令在发送者和请求者之间建立单向连接。
◦ 中介者清除了发送者和请求者之间的直接连接,强制它们
通过一个中介对象进行间接沟通。
◦ 观察者允许接收者动态地订阅或取消接收请求。
• 责任链通常和组合模式结合使用。在这种情况下,叶组件接收到请求后,可以将请求沿包含全体父组件的链一直传递至对象树的底部。
• 责任链的管理者可使用命令模式实现。在这种情况下,你可以对由请求代表的同一个上下文对象执行许多不同的操作。
还有另外一种实现方式,那就是请求自身就是一个命令对象。
在这种情况下,你可以对由一系列不同上下文连接而成的链
执行相同的操作。