- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
步步为营.NET 设计模式学习笔记十九、ChainofResponsibility(职责链模式)
概述
在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。
如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。
意图
责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
结构图
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
生活中的例子
击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。
击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。
示例用例图
在公司,员工都有出差的机会,出差就会产生借款,借款时就会产生这个申请单由谁来审批的问题,部门经理、总监和董事长各有不同的审批权限,看我们由这个需求设计的一个职责链模式,用例图如下:
代码设计
先创建BorrowApplication.cs:
1
public
class
BorrowApplication
2
{
3
private
string _Name;
4
private
double _Money;
5
private
string _Purpose;
6
7
public
string Name
8
{
9
get {return _Name;
}
10
set {_Name=value;
}
11
}
12
13
public
double
Money
14
{
15
get {
return _Money;}
16
set {
_Money=value;}
17
}
18
19
public
string
Purpose
20
{
21
get {
return _Purpose;
}
22
set {
_Purpose=value;
}
23
}
24
25
public
BorrowApplication(string
name,
double
money,
string
purpose)
26
{
27
this._Name=name;
28
this._Money=money;
29
this._Purpose=purpose;
30
}
31
}
再创建Approve.cs:
1 public
abstract
class Approve
2 {
3
private
string _Name;
4
private
Approve_HighApprove;
5
6
public
string Name
7
{
8
get {return _Name;}
9
set {_Name=value;}
10
}
11
12
public
ApproveHighApprove
13
{
14
get {return _HighApprove;
}
15
set {_HighApprove=value;
}
16
}
17
18
public
Approve(string name)
19
{
20
this._Name=name;
21
}
22
///summary
///设置高一级审批对象
////summary
///paramname=approve/param
public void SetHighApprove(Approveapprove)28 {
29 _HighApprove=approve;30 }
31
///summary
///处理申请
////summary
///paramname=borrowApplication/param
///returns/returns
public abstract string HandleApplication(BorrowApplica
文档评论(0)