enhancement: #1947 implement chain of responsibilities with java stream (#2123)

This commit is contained in:
JanFidor
2022-10-26 19:26:04 +02:00
committed by GitHub
parent 4108f86177
commit 1ea98bb8d5
8 changed files with 106 additions and 86 deletions
+9 -3
View File
@@ -118,18 +118,24 @@ The Orc King gives the orders and forms the chain.
```java
public class OrcKing {
RequestHandler chain;
private List<RequestHandler> handlers;
public OrcKing() {
buildChain();
}
private void buildChain() {
chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null)));
handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier());
}
public void makeRequest(Request req) {
chain.handleRequest(req);
handlers
.stream()
.sorted(Comparator.comparing(RequestHandler::getPriority))
.filter(handler -> handler.canHandleRequest(req))
.findFirst()
.ifPresent(handler -> handler.handle(req));
}
}
```
Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 132 KiB

@@ -5,25 +5,34 @@ package com.iluwatar.chain {
+ main(args : String[]) {static}
}
class OrcCommander {
+ OrcCommander(handler : RequestHandler)
+ handleRequest(req : Request)
+ toString() : String
- LOGGER : Logger {static}
+ OrcCommander()
+ canHandleRequest(req : Request) : boolean
+ getPriority() : int
+ handle(req : Request)
+ name() : String
}
class OrcKing {
- chain : RequestHandler
- handlers : List<RequestHandler>
+ OrcKing()
- buildChain()
+ makeRequest(req : Request)
}
class OrcOfficer {
+ OrcOfficer(handler : RequestHandler)
+ handleRequest(req : Request)
+ toString() : String
- LOGGER : Logger {static}
+ OrcOfficer()
+ canHandleRequest(req : Request) : boolean
+ getPriority() : int
+ handle(req : Request)
+ name() : String
}
class OrcSoldier {
+ OrcSoldier(handler : RequestHandler)
+ handleRequest(req : Request)
+ toString() : String
- LOGGER : Logger {static}
+ OrcSoldier()
+ canHandleRequest(req : Request) : boolean
+ getPriority() : int
+ handle(req : Request)
+ name() : String
}
class Request {
- handled : boolean
@@ -36,13 +45,11 @@ package com.iluwatar.chain {
+ markHandled()
+ toString() : String
}
abstract class RequestHandler {
- LOGGER : Logger {static}
- next : RequestHandler
+ RequestHandler(next : RequestHandler)
+ handleRequest(req : Request)
# printHandling(req : Request)
+ toString() : String {abstract}
interface RequestHandler {
+ canHandleRequest(Request) : boolean {abstract}
+ getPriority() : int {abstract}
+ handle(Request) {abstract}
+ name() : String {abstract}
}
enum RequestType {
+ COLLECT_TAX {static}
@@ -52,10 +59,9 @@ package com.iluwatar.chain {
+ values() : RequestType[] {static}
}
}
OrcKing --> "-chain" RequestHandler
RequestHandler --> "-next" RequestHandler
OrcKing --> "-handlers" RequestHandler
Request --> "-requestType" RequestType
OrcCommander --|> RequestHandler
OrcOfficer --|> RequestHandler
OrcSoldier --|> RequestHandler
OrcCommander ..|> RequestHandler
OrcOfficer ..|> RequestHandler
OrcSoldier ..|> RequestHandler
@enduml
@@ -24,27 +24,31 @@
*/
package com.iluwatar.chain;
import lombok.extern.slf4j.Slf4j;
/**
* OrcCommander.
*/
public class OrcCommander extends RequestHandler {
public OrcCommander(RequestHandler handler) {
super(handler);
@Slf4j
public class OrcCommander implements RequestHandler {
@Override
public boolean canHandleRequest(Request req) {
return req.getRequestType() == RequestType.DEFEND_CASTLE;
}
@Override
public void handleRequest(Request req) {
if (RequestType.DEFEND_CASTLE == req.getRequestType()) {
printHandling(req);
req.markHandled();
} else {
super.handleRequest(req);
}
public int getPriority() {
return 2;
}
@Override
public String toString() {
public void handle(Request req) {
req.markHandled();
LOGGER.info("{} handling request \"{}\"", name(), req);
}
@Override
public String name() {
return "Orc commander";
}
}
@@ -24,23 +24,34 @@
*/
package com.iluwatar.chain;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
/**
* OrcKing makes requests that are handled by the chain.
*/
public class OrcKing {
private RequestHandler chain;
private List<RequestHandler> handlers;
public OrcKing() {
buildChain();
}
private void buildChain() {
chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null)));
handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier());
}
/**
* Handle request by the chain.
*/
public void makeRequest(Request req) {
chain.handleRequest(req);
handlers
.stream()
.sorted(Comparator.comparing(RequestHandler::getPriority))
.filter(handler -> handler.canHandleRequest(req))
.findFirst()
.ifPresent(handler -> handler.handle(req));
}
}
@@ -24,28 +24,32 @@
*/
package com.iluwatar.chain;
import lombok.extern.slf4j.Slf4j;
/**
* OrcOfficer.
*/
public class OrcOfficer extends RequestHandler {
public OrcOfficer(RequestHandler handler) {
super(handler);
@Slf4j
public class OrcOfficer implements RequestHandler {
@Override
public boolean canHandleRequest(Request req) {
return req.getRequestType() == RequestType.TORTURE_PRISONER;
}
@Override
public void handleRequest(Request req) {
if (RequestType.TORTURE_PRISONER == req.getRequestType()) {
printHandling(req);
req.markHandled();
} else {
super.handleRequest(req);
}
public int getPriority() {
return 3;
}
@Override
public String toString() {
public void handle(Request req) {
req.markHandled();
LOGGER.info("{} handling request \"{}\"", name(), req);
}
@Override
public String name() {
return "Orc officer";
}
}
@@ -24,27 +24,31 @@
*/
package com.iluwatar.chain;
import lombok.extern.slf4j.Slf4j;
/**
* OrcSoldier.
*/
public class OrcSoldier extends RequestHandler {
public OrcSoldier(RequestHandler handler) {
super(handler);
@Slf4j
public class OrcSoldier implements RequestHandler {
@Override
public boolean canHandleRequest(Request req) {
return req.getRequestType() == RequestType.COLLECT_TAX;
}
@Override
public void handleRequest(Request req) {
if (RequestType.COLLECT_TAX == req.getRequestType()) {
printHandling(req);
req.markHandled();
} else {
super.handleRequest(req);
}
public int getPriority() {
return 1;
}
@Override
public String toString() {
public void handle(Request req) {
req.markHandled();
LOGGER.info("{} handling request \"{}\"", name(), req);
}
@Override
public String name() {
return "Orc soldier";
}
}
@@ -24,31 +24,16 @@
*/
package com.iluwatar.chain;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* RequestHandler.
*/
@Slf4j
@AllArgsConstructor
public abstract class RequestHandler {
public interface RequestHandler {
private final RequestHandler next;
boolean canHandleRequest(Request req);
/**
* Request handler.
*/
public void handleRequest(Request req) {
if (next != null) {
next.handleRequest(req);
}
}
int getPriority();
protected void printHandling(Request req) {
LOGGER.info("{} handling request \"{}\"", this, req);
}
void handle(Request req);
@Override
public abstract String toString();
String name();
}