Update chain of responsibility
This commit is contained in:
parent
0f9f3b90c2
commit
ed98e7a128
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: pattern
|
layout: pattern
|
||||||
title: Chain of responsibility
|
title: Chain of responsibility
|
||||||
folder: chain
|
folder: chain-of-responsibility
|
||||||
permalink: /patterns/chain/
|
permalink: /patterns/chain-of-responsibility/
|
||||||
categories: Behavioral
|
categories: Behavioral
|
||||||
language: en
|
language: en
|
||||||
tags:
|
tags:
|
||||||
@ -10,16 +10,17 @@ tags:
|
|||||||
---
|
---
|
||||||
|
|
||||||
## Intent
|
## Intent
|
||||||
|
|
||||||
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to
|
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to
|
||||||
handle the request. Chain the receiving objects and pass the request along the chain until an object
|
handle the request. Chain the receiving objects and pass the request along the chain until an object
|
||||||
handles it.
|
handles it.
|
||||||
|
|
||||||
## Explanation
|
## Explanation
|
||||||
|
|
||||||
Real world example
|
Real-world example
|
||||||
|
|
||||||
> The Orc King gives loud orders to his army. The closest one to react is the commander, then
|
> The Orc King gives loud orders to his army. The closest one to react is the commander, then
|
||||||
> officer and then soldier. The commander, officer and soldier here form a chain of responsibility.
|
> an officer, and then a soldier. The commander, officer, and soldier form a chain of responsibility.
|
||||||
|
|
||||||
In plain words
|
In plain words
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ Wikipedia says
|
|||||||
|
|
||||||
**Programmatic Example**
|
**Programmatic Example**
|
||||||
|
|
||||||
Translating our example with the orcs from above. First we have the `Request` class:
|
Translating our example with the orcs from above. First, we have the `Request` class:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class Request {
|
public class Request {
|
||||||
@ -66,7 +67,7 @@ public enum RequestType {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Then the request handler hierarchy
|
Next, we show the request handler hierarchy.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -116,7 +117,7 @@ public class OrcCommander extends RequestHandler {
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Then we have the Orc King who gives the orders and forms the chain
|
Th Orc King gives the orders and forms the chain.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class OrcKing {
|
public class OrcKing {
|
||||||
@ -136,18 +137,26 @@ public class OrcKing {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Then it is used as follows
|
The chain of responsibility in action.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
var king = new OrcKing();
|
var king = new OrcKing();
|
||||||
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle"
|
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle"));
|
||||||
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner"
|
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner"));
|
||||||
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax"
|
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax"));
|
||||||
|
```
|
||||||
|
|
||||||
|
The console output.
|
||||||
|
|
||||||
|
```
|
||||||
|
Orc commander handling request "defend castle"
|
||||||
|
Orc officer handling request "torture prisoner"
|
||||||
|
Orc soldier handling request "collect tax"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
## Class diagram
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Applicability
|
## Applicability
|
||||||
|
|
||||||
@ -157,7 +166,7 @@ Use Chain of Responsibility when
|
|||||||
* You want to issue a request to one of several objects without specifying the receiver explicitly.
|
* You want to issue a request to one of several objects without specifying the receiver explicitly.
|
||||||
* The set of objects that can handle a request should be specified dynamically.
|
* The set of objects that can handle a request should be specified dynamically.
|
||||||
|
|
||||||
## Real world examples
|
## Real-world examples
|
||||||
|
|
||||||
* [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29)
|
* [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29)
|
||||||
* [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html)
|
* [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html)
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
@ -31,7 +31,7 @@
|
|||||||
<artifactId>java-design-patterns</artifactId>
|
<artifactId>java-design-patterns</artifactId>
|
||||||
<version>1.25.0-SNAPSHOT</version>
|
<version>1.25.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>chain</artifactId>
|
<artifactId>chain-of-responsibility</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
2
pom.xml
2
pom.xml
@ -105,7 +105,7 @@
|
|||||||
<module>facade</module>
|
<module>facade</module>
|
||||||
<module>flyweight</module>
|
<module>flyweight</module>
|
||||||
<module>proxy</module>
|
<module>proxy</module>
|
||||||
<module>chain</module>
|
<module>chain-of-responsibility</module>
|
||||||
<module>command</module>
|
<module>command</module>
|
||||||
<module>interpreter</module>
|
<module>interpreter</module>
|
||||||
<module>iterator</module>
|
<module>iterator</module>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user