基于设计模式的学习之旅-----责任链(附源码)

        基于设计模式的学习之旅-----责任链

1、初识责任链

击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。

 

比如说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又贾宝玉传给贾环,由贾环传回给贾母,如此往复,如下图所示。当鼓声停止时,手中有花的人就得执行酒令。

 

击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。

2、什么是责任链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

3、模式结构图

 

一个典型的对象结构可能如下图所示:

4、模式代码事例

场景一:纯的责任链事例

李四生病了,去大医院看医生,他自己认为是去外科就行,结果去了后外科医生告诉他这个他医不了,让他去耳鼻科看看。于是李四又到了耳鼻科,耳鼻科医生看了下,发现李四的病情严重了,就告诉他这个他搞不定,让他去急症科。于是李四又到了急症科,最后急症科医好了李四的病。

 

场景二:不纯的责任链事例

王五一年一次的体检来了,他先去内科体检,结束后,医生告诉他需要去外科体检。他来到了外科,体检结束后外科医师告诉他还需要去心电图科体检。然后他去了心电图科,心电图体检好后,就做完了所有体检项目了。

 

场景三:非责任链模式

张三生病了,到了一个私人的小诊所。医生问题是不是 头疼,是不是肚子疼,帮他测量了是不是感冒,然后在诊断了下是不是咳嗽。 最后确定了他的病情,感冒了。医生给张三开了副感冒药,张三病几天就好了。

场景一:

AbstractSickHandler:

 

EmergencySickHandler

 

GeneralSurgerySickHandler

 

OtolaryngologySickHandler

 

SimplePatternRun

 

场景二:

AbstractCheckUpHandler

 

ElectrocardiogramCheckUpHandler

MedicineCheckUpHandler

 

场景三:

ClinicDoctor

5、模式参与者

Handle

ConcreteHandle

Client

6、模式优缺点

1) 降低耦合度 该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。

2) 增强了给对象指派职责( R e s p o n s i b i l i t y )的灵活性 当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。

3) 不保证被接受 既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。

7、模式适用性

A、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

B、你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

C、可处理一个请求的对象集合应被动态指定。

 

 

点击下载“文档以及源码下载

 

欢迎转载,请注明出处“http://www.cnblogs.com/luxiaofeng54/archive/2013/04/07/3006350.html

posted on 2013-04-07 22:17  陆晓峰  阅读(1146)  评论(2编辑  收藏  举报

导航