步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
概述
在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。
如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。意图
责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
结构图
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
生活中的例子
击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。
击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。
示例用例图
在公司,员工都有出差的机会,出差就会产生借款,借款时就会产生这个申请单由谁来审批的问题,部门经理、总监和董事长各有不同的审批权限,看我们由这个需求设计的一个职责链模式,用例图如下:
代码设计
先创建BorrowApplication.cs:
01
public
class
BorrowApplication
02
{
03
private
string
_Name;
04
private
double
_Money;
05
private
string
_Purpose;
06
07
public
string
Name
08
{
09
get
{
return
_Name; }
10
set
{ _Name = value; }
11
}
12
13
public
double
Money
14
{
15
get
{
return
_Money; }