这是张富涛的第1篇原创
设计模式:责任链模式
1. 责任链模式简介
责任链模式(Chain of Responsibility Pattern)是一种设计模式,对于责任链模式可以理解为进行一次“击鼓传花”的游戏,玩家围成一个圈,每个玩家都有一位下家,这个玩家只要知道自己的下家就可以了,花到了自己手里,如果鼓声没有决定自己喝酒(自己不满足执行的要求),就将花传给自己的下家,直到最终有一个玩家喝酒或者花传到最后一位玩家那没有下家了。
图:红楼梦中击鼓传花与责任链模式
将所有执行者围成一条直链,或者一条环链,或者一个树结构,每一位执行者不需要知道自己的上家,只需要知道自己的下家,这样一个请求过来,请求在链上传递,直到最终有一个执行者处理这个请求。发送请求的客户端不知道哪一位执行者最终处理这个请求,这可以使请求的发送者和请求的处理者解耦。
(还有一个例子可以更深入的理解“责任链模式”:公司中一个任务从最高层下达下来,总经理找到经理,经理找到组长,组长找到组员……一级一级的传达下任务,直到有一个人真正的执行这个任务。)
ps:读者可以通过责任链的具体实现实例去理解本文:具体实现为“JS 中的事件冒泡"、java中的"Filter":
2.代码结构:
需要有一个作为规定规范的抽象的执行者:这通常使用抽象类,规定了每一位参与游戏的玩家需要有一个下家、以及“执行请求”的抽象方法,让玩家自己去实现具体内容,并为他们提供”如果自己不处理请求时使下家执行的方法“。
同时需要有具体执行者的角色:这些具体的执行者继承了抽象执行者,同时规定这些具体执行者必须知道自己的下家(使用构造函数实现),他们需要实现自己执行请求的方法:如果自己无法处理或不满足要求将请求转给下家去做。
那么下面我们看一下代码的具体实现吧:
抽象执行者(Player):
具体执行者(Zhangsan):
具体执行者(Lisi):
具体执行者(Wangwu):
模拟一个客户端进行发送请求:
程序输出结果:
我们将模拟的客户端请求要求改为4,结果为:
小结:
- 这就是“责任链模式”,原理上总结起来有以下几点:
- 很多的对象由每一个对象对其下家的引用而连接起来的一条链。
- 请求在这个链上传递,知道链上的某一个对象决定处理此请求。
- 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求。
- 责任链可能是一条直线、一个环链甚至一个树结构的一部分。
代码设计上总结起来有以下几点:
- 上家必须知道下家,下家没必要知道上家。
- 通常需要一个抽象的执行者。
- 抽象执行者需要提供一个“下家”的属性。
- 抽象执行者需要一个或多个抽象类让具体执行者去实现执行的方法。
- 抽象执行者要规定一个方法让具体执行者在不满足条件的情况下将请求传给自己的下家。
- 具体执行者实现必须知道下家的方式是:创建一个构造函数。
---------------
公众号:张富涛的学习笔记(ID:futaoNT)
知乎:张富涛
CSDN:张富涛
B站:你给的宝物
这是一个在夜晚可以靠编程拯救世界的程序员,关注他将在第一时间获悉他的知识、工作心得!
长按下图二维码关注: