设计模式—— 十六 :责任链模式( 二 )


不使用责任链模式
以批判的态度去分析这个业务场景 , 类图如下:
图16-2:腐朽的“三从”类图
是三个有决策权对象的接口 , 是女性的代码 。下面是实现:
public interface IWomen {//获得个人状况 public int getType(); //获得个人请示 public String getRequest();}
public class Women implements IWomen{/** 通过一个int类型的参数来描述妇女的个人状况 * 1--未出嫁 * 2--出嫁 * 3--夫死 */private int type = 0;// 妇女的请示private String request = "";// 构造函数传递过来请求public Women(int _type, String _request) {this.type = _type;this.request = _request;}// 获得自己的状况public int getType() {return this.type;}// 获得妇女的请求public String getRequest() {return this.request;}}
public interface IHandler {//一个女性(女儿、妻子或者母亲)要求逛街 , 你要处理这个请求 public void HandleMessage(IWomen women);}
public class Father implements IHandler {// 未出嫁的女儿来请示父亲public void HandleMessage(IWomen women) {System.out.println("女儿的请示是:" + women.getRequest());System.out.println("父亲的答复是:同意");}}public class Husband implements IHandler {// 妻子向丈夫请示public void HandleMessage(IWomen women) {System.out.println("妻子的请示是:" + women.getRequest());System.out.println("丈夫的答复是:同意");}}public class Son implements IHandler {// 母亲向儿子请示public void HandleMessage(IWomen women) {System.out.println("母亲的请示是:" + women.getRequest());System.out.println("儿子的答复是:同意");}}
public class Client {public static void main(String[] args) {// 随机挑选几个女性Random rand = new Random();ArrayList arrayList = new ArrayList();for (int i = 0; i < 5; i++) {arrayList.add(new Women(rand.nextInt(4), "看戏"));}// 定义三个请示对象IHandler father = new Father();IHandler husband = new Husband();IHandler son = new Son();for (IWomen women : arrayList) {if (women.getType() == 1) {// 未结婚少女 , 请示父亲System.out.println("\n--------女儿向父亲请示-------");father.HandleMessage(women);} else if (women.getType() == 2) {// 已婚少妇 , 请示丈夫System.out.println("\n--------妻子向丈夫请示-------");husband.HandleMessage(women);} else if (women.getType() == 3) {// 母亲请示儿子System.out.println("\n--------母亲向儿子请示-------");son.HandleMessage(women);} else {// 暂时什么也不做}}}}
首先是通过随机方法产生了5个古代妇女的对象 , 然后看她们是如何就看戏这件事去请示的 , 运行结果如下:
OK , 业务已经实现了 , 但是明显这个业务实现是存在问题的 。
● 职责界定不清晰
对女儿提出的请示 , 应该在父亲类中做出决定 , 父亲有责任、有义务处理女儿的请示 ,  因此类应该是知道女儿的请求自己处理 , 而不是在类中进行组装出来 , 也就是说原本应该是父亲这个类做的事情抛给了其他类进行处理 。
● 代码臃肿
我们在类中写了if…else的判断条件 , 而且能随着能处理该类型的请示人员越多 , if…else的判断就越多 。
● 耦合过重
这是什么意思呢 , 我们要根据Women的type来决定使用的那个实现类来处理请 求 。有一个问题是:如果的实现类继续扩展怎么办?如果修改类 , 那就违背了开闭原则 。