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


非常简单,有处理权的人对妇女的请求进行处理,分别有三个实现类,在女儿没有出嫁之前父亲是有决定权的 。
public class Father implements IHandler {@Overridepublic void handleMessage(IWomen women) {//未出嫁的女儿来请示父亲System.out.println("女儿的请示是:" + women.getRequest());System.out.println("父亲的答复是:同意");}}
在女性出嫁后,丈夫有决定权 。
public class Husband implements IHandler {@Overridepublic void handleMessage(IWomen women) {//妻子向丈夫请示System.out.println("妻子的请示是:" + women.getRequest());System.out.println("丈夫的答复是:同意");}}
在女性丧偶后,对母亲提出的请求儿子有决定权 。
public class Son implements IHandler {@Overridepublic void handleMessage(IWomen women) {//母亲向儿子请示System.out.println("母亲的请示是:" + women.getRequest());System.out.println("儿子的答复是:同意");}}
上三个实现类非常简单,只有一个方法,处理女儿、妻子、母亲提出的请求,我们来模拟一下一个古代妇女出去逛街是如何请示的 。
public class Client {public static void main(String[] args) {//随机挑选几个女性Random random = new Random();ArrayList arrayList = new ArrayList<>();for (int i = 0; i < 5; i++) {arrayList.add(new Women(random.nextInt(3) + 1, "我要出去逛街"));}//定义三个请示对象IHandler father = new Father();IHandler husband = new Husband();IHandler son = new Son();for (IWomen women : arrayList) {switch (women.getType()) {case 1:System.out.println("--------女儿向父亲请示--------");father.handleMessage(women);break;case 2:System.out.println("--------妻子向丈夫请示--------");husband.handleMessage(women);break;case 3:System.out.println("--------母亲向儿子请示--------");son.handleMessage(women);break;default:break;}}}}
首先是通过随机方法产生了5个古代妇女的对象,然后看她们是如何就逛街这件事去请示的,运行结果如下所示(由于是随机的,您看到的结果可能和这里有所不同):
--------女儿向父亲请示--------
女儿的请示是:我要出去逛街
父亲的答复是:同意
--------母亲向儿子请示--------
母亲的请示是:我要出去逛街
儿子的答复是:同意
--------女儿向父亲请示--------
女儿的请示是:我要出去逛街
父亲的答复是:同意
--------母亲向儿子请示--------
母亲的请示是:我要出去逛街
儿子的答复是:同意
--------妻子向丈夫请示--------
妻子的请示是:我要出去逛街
丈夫的答复是:同意
三从四德”的旧社会规范已经完整地表现出来了,你看谁向谁请示都定义出来了,但是你是不是发现这个程序写得有点不舒服?有点别扭?有点想重构它的感觉?那就对了!这段代码有以下几个问题:
● 职责界定不清晰
对女儿提出的请示,应该在父亲类中做出决定,父亲有责任、有义务处理女儿的请示,因此类应该是知道女儿的请求自己处理,而不是在类中进行组装出来,也就是说原本应该是父亲这个类做的事情抛给了其他类进行处理,不应该是这样的 。
● 代码臃肿
我们在类中写了if...else的判断条件,而且能随着能处理该类型的请示人员越多,if...else的判断就越多,想想看,臃肿的条件判断还怎么有可读性?!
● 耦合过重
这是什么意思呢,我们要根据Women的type来决定使用的那个实现类来处理请求 。有一个问题是:如果的实现类继续扩展怎么办?修改类?与开闭原则违背了!