内容简介:它属于
目的
它属于 行为设计模式 目录。通过为多个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿链传递请求,直到对象处理它。
说明
国王向他的军队发出了命令。最早做出反应的是指挥官,然后是军官,最后是士兵。这里的指挥官,军官和士兵构成了一系列责任。简单来说
它有助于构建一系列对象。请求从一端进入并从一个对象到另一个对象,直到找到合适的处理程序。
维基百科说
在面向对象的设计中,责任链模式是一种由命令对象源和一系列处理对象组成的设计模式。每个处理对象都包含定义它可以处理的命令对象类型的逻辑; 其余的传递给链中的下一个处理对象。责任链模式的优势
- 它减少了耦合。
- 它在为对象分配职责时增加了灵活性。
- 它允许一组类作为一个类; 在一个类中生成的事件可以在组合的帮助下发送到其他处理程序类。
结构
参与者
1.处理程序
- 定义用于处理请求的接口。
- (可选)实现后续链接。
2. ConcreteHandler
- 处理它负责的请求。
- 可以访问其继任者。
- 如果ConcreteHandler可以处理该请求,则处理; 否则
- 它将请求转发给其继任者。
3.客户端
- 向链上的ConcreteHandler对象启动请求
合作
- 当客户端发出请求时,请求将沿着链传播,直到ConcreteHandler对象负责处理它。
源代码
第1步:首先我们有请求类
<b>public</b> <b>class</b> Request { <b>private</b> <b>final</b> RequestType requestType; <b>private</b> <b>final</b> String requestDescription; <b>private</b> <b>boolean</b> handled; <b>public</b> Request(<b>final</b> RequestType requestType, <b>final</b> String requestDescription) { <b>this</b>.requestType = Objects.requireNonNull(requestType); <b>this</b>.requestDescription = Objects.requireNonNull(requestDescription); } <b>public</b> String getRequestDescription() { <b>return</b> requestDescription; } <b>public</b> RequestType getRequestType() { <b>return</b> requestType; } <b>public</b> <b>void</b> markHandled() { <b>this</b>.handled = <b>true</b>; } <b>public</b> <b>boolean</b> isHandled() { <b>return</b> <b>this</b>.handled; } @Override <b>public</b> String toString() { <b>return</b> getRequestDescription(); } } <b>public</b> enum RequestType { DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX }
第2步:然后是请求处理程序层次结构
<b>public</b> <b>abstract</b> <b>class</b> RequestHandler { <b>private</b> <b>static</b> <b>final</b> Logger LOGGER = LoggerFactory.getLogger(RequestHandler.<b>class</b>); <b>private</b> RequestHandler next; <b>public</b> RequestHandler(RequestHandler next) { <b>this</b>.next = next; } <b>public</b> <b>void</b> handleRequest(Request req) { <b>if</b> (next != <b>null</b>) { next.handleRequest(req); } } <b>protected</b> <b>void</b> printHandling(Request req) { LOGGER.info(<font>"{} handling request \"{}\""</font><font>, <b>this</b>, req); } @Override <b>public</b> <b>abstract</b> String toString(); } <b>public</b> <b>class</b> OrcCommander <b>extends</b> RequestHandler { <b>public</b> OrcCommander(RequestHandler handler) { <b>super</b>(handler); } @Override <b>public</b> <b>void</b> handleRequest(Request req) { <b>if</b> (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) { printHandling(req); req.markHandled(); } <b>else</b> { <b>super</b>.handleRequest(req); } } @Override <b>public</b> String toString() { <b>return</b> </font><font>"Orc commander"</font><font>; } } </font><font><i>// OrcOfficer and OrcSoldier are defined similarly as OrcCommander</i></font><font> </font>
第3步:然后我们有Orc King给出订单并形成链
<b>public</b> <b>class</b> OrcKing { RequestHandler chain; <b>public</b> OrcKing() { buildChain(); } <b>private</b> <b>void</b> buildChain() { chain = <b>new</b> OrcCommander(<b>new</b> OrcOfficer(<b>new</b> OrcSoldier(<b>null</b>))); } <b>public</b> <b>void</b> makeRequest(Request req) { chain.handleRequest(req); } }
步骤4:然后使用如下
OrcKing king = <b>new</b> OrcKing(); king.makeRequest(<b>new</b> Request(RequestType.DEFEND_CASTLE, <font>"defend castle"</font><font>)); </font><font><i>// Orc commander handling request "defend castle"</i></font><font> king.makeRequest(<b>new</b> Request(RequestType.TORTURE_PRISONER, </font><font>"torture prisoner"</font><font>)); </font><font><i>// Orc officer handling request "torture prisoner"</i></font><font> king.makeRequest(<b>new</b> Request(RequestType.COLLECT_TAX, </font><font>"collect tax"</font><font>)); </font><font><i>// Orc soldier handling request "collect tax"</i></font><font> </font>
适用场景
多个对象可以处理请求,并且处理程序不是先前已知的。应自动确定处理程序
您希望向几个对象之一发出请求,而不明确指定接收方
应动态指定可以处理请求的对象集。
以上所述就是小编给大家介绍的《责任链模式(Chain of responsibility)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式(十八)责任链模式
- 每天一个设计模式之责任链模式
- 设计模式第七讲-责任链模式
- 搬移linux命令 命令模式 + 责任链模式
- 设计模式(四)OkHttp的责任链模式
- Java设计模式综合运用(责任链模式进阶)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML & CSS设计与构建网站
[美] Jon Duckett / 刘涛、陈学敏 / 清华大学出版社 / 2013-1 / 59.80元
欢迎您选择一种更高效的学习HTML和CSS的方式。不管您设计和建立新网站,还是想更好地控制现有网站,都可以在《HTML & CSS 设计与构建网站》一书的指导下创建出用户友好、令用户赏心悦目的Web内容。我们知道,编码是一项令人望而生畏的工作,而本书却采用有别于许多传统编程书籍的新颖编排方式,将使您收到事半功倍的学习效果。 每一页都在短小精悍的示例代码的引导下,简明直观、直截了当地阐述一个新......一起来看看 《HTML & CSS设计与构建网站》 这本书的介绍吧!