十三 每天学习一个设计模式:行为型之责任链模式

一、基本概念
责任链模式定义如下:Avoidtheof ato itsbymore than oneathe .Chain theand pass thealong the chain until anit.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系 。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 。)
二、通俗解释
CHAIN OF 责任链模式:晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑! 责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链 。请求在这个链上传递,直到链上的某一个对象决定处理此请求 。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任 。处理者有两个选择:承担责任或者把责任推给下家 。一个请求可以最终不被任何接收端对象所接受 。
三、责任链模式详解 1.古代妇女的枷锁——“三从四德”
中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子” 。也就是说,一位女性在结婚之前要听从于父亲,结婚之后要听从于丈夫,如果丈夫死了还要听从于儿子 。举例来说,如果一位女性要出去逛街,在她出嫁前必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?那就得问问儿子是否允许自己出去逛街 。估计你接下来马上要问:“要是没有儿子怎么办?”那就请示小叔子、侄子等 。在父系社会中,妇女只占从属地位,现在想想中国古代的妇女还是挺悲惨的,连逛街都要多番请示 。作为父亲、丈夫或儿子,只有两种选择:要不承担起责任来,允许她或不允许她逛街;要不就让她请示下一个人,这是整个社会体系的约束,应用到我们项目中就是业务规则 。下面来看如何通过程序来实现“三从”,需求很简单:通过程序描述一下古代妇女的“三从”制度 。好,我们先来看类图,如图所示 。
类图非常简单,是三个有决策权对象的接口,是女性的代码,其实现也非常简单,如下:
public interface IWomen {/*** 获得个人状况** @return int*/public int getType();/*** 获得个人请示,你要干什么?出去逛街?约会?还是看电影?** @return string*/public String getRequest();}
女性接口仅两个方法,一个是取得当前的个人状况,通过返回值决定是结婚了还是没结婚、丈夫是否在世等,另外一个方法是要请示的内容,要出去逛街还是吃饭 。
public class Women implements IWomen {/*** 妇女状况,1:未出嫁,2:出嫁,3:夫死*/private int type = 0;/*** 妇女的请示*/private String request = "";/*** 构造函数传递过来请求** @param type* @param request*/public Women(int type, String request) {this.type = type;this.request = request;}@Overridepublic int getType() {return this.type;}@Overridepublic String getRequest() {return this.request;}}
我们使用数字来代表女性的不同状态:1是未结婚;2是已经结婚的,而且丈夫健在;3是丈夫去世了 。从整个设计上分析,有处理权的人(如父亲、丈夫、儿子)才是设计的核心,他们是要处理这些请求的,我们来看有处理权的人员接口 。
public interface IHandler {/*** 一个女性要求逛街,你要处理这个请求* @param women*/void handleMessage(IWomen women);}