读书 | 设计模式之禅 - 责任链模式

文章目录
1. 实现古代妇女的“三从”制度
一位女性在结婚之前要听从于父亲,结婚之后要听从于丈夫,如果丈夫死了还要听从于儿子 。作为父亲、丈夫或儿子,只有两种选择:要不承担起责任来,允许她或不允许她逛街;要不就让她请示下一个人,这是整个社会体系的约束 。
下面来看如何通过程序来实现“三从”,需求很简单:通过程序描述一下古代妇女的“三从”制度 。
对应的类图:是三个有决策权对象的接口,是女性的代码
①接口
public interface IWomen {/*** 获得个人状况** @return 结婚了还是没结婚、丈夫是否在世*/int getType();/*** 获得个人请示* @return 你要干什么?出去逛街?约会?还是看电影?*/String getRequest();}
② Women 实现类
@NoArgsConstructor@AllArgsConstructorpublic class Women implements IWomen {/** 通过一个int类型的参数来描述妇女的个人状况* 1--未出嫁* 2--出嫁* 3--夫死*/private int type = 0;//妇女的请示private String request = "";@Overridepublic int getType() {return type;}@Overridepublic String getRequest() {return 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("丈夫的答复是:同意");}}
⑥ Son 实现类
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 {//暂时什么也不做}}}}
上述代码实现存在职责界定不清晰,代码臃肿,耦合过重,异常情况欠考虑等问题 。
2. 实现古代妇女的“三从”制度-优化
女性提出一个请示,必然要获得一个答复,甭管是同意还是不同意,总之是要一个答复的,而且这个答复是唯一的,不能说是父亲作出一个决断,而丈夫也作出了一个决断,也即是请示传递出去,必然有一个唯一的处理人给出唯一的答复 。
我们可以抽象成这样一个结构,女性的请求先发送到父亲类,父亲类一看是自己要处理的,就作出回应处理,如果女儿已经出嫁了,那就要把这个请求转发到女婿来处理,那女婿一旦去天国报道了,那就由儿子来处理这个请求 。