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

This commit is contained in:
JanFidor
2022-10-26 20:26:04 +03: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 ```java
public class OrcKing { public class OrcKing {
RequestHandler chain;
private List<RequestHandler> handlers;
public OrcKing() { public OrcKing() {
buildChain(); buildChain();
} }
private void 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) { 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} + main(args : String[]) {static}
} }
class OrcCommander { class OrcCommander {
+ OrcCommander(handler : RequestHandler) - LOGGER : Logger {static}
+ handleRequest(req : Request) + OrcCommander()
+ toString() : String + canHandleRequest(req : Request) : boolean
+ getPriority() : int
+ handle(req : Request)
+ name() : String
} }
class OrcKing { class OrcKing {
- chain : RequestHandler - handlers : List<RequestHandler>
+ OrcKing() + OrcKing()
- buildChain() - buildChain()
+ makeRequest(req : Request) + makeRequest(req : Request)
} }
class OrcOfficer { class OrcOfficer {
+ OrcOfficer(handler : RequestHandler) - LOGGER : Logger {static}
+ handleRequest(req : Request) + OrcOfficer()
+ toString() : String + canHandleRequest(req : Request) : boolean
+ getPriority() : int
+ handle(req : Request)
+ name() : String
} }
class OrcSoldier { class OrcSoldier {
+ OrcSoldier(handler : RequestHandler) - LOGGER : Logger {static}
+ handleRequest(req : Request) + OrcSoldier()
+ toString() : String + canHandleRequest(req : Request) : boolean
+ getPriority() : int
+ handle(req : Request)
+ name() : String
} }
class Request { class Request {
- handled : boolean - handled : boolean
@@ -36,13 +45,11 @@ package com.iluwatar.chain {
+ markHandled() + markHandled()
+ toString() : String + toString() : String
} }
abstract class RequestHandler { interface RequestHandler {
- LOGGER : Logger {static} + canHandleRequest(Request) : boolean {abstract}
- next : RequestHandler + getPriority() : int {abstract}
+ RequestHandler(next : RequestHandler) + handle(Request) {abstract}
+ handleRequest(req : Request) + name() : String {abstract}
# printHandling(req : Request)
+ toString() : String {abstract}
} }
enum RequestType { enum RequestType {
+ COLLECT_TAX {static} + COLLECT_TAX {static}
@@ -52,10 +59,9 @@ package com.iluwatar.chain {
+ values() : RequestType[] {static} + values() : RequestType[] {static}
} }
} }
OrcKing --> "-chain" RequestHandler OrcKing --> "-handlers" RequestHandler
RequestHandler --> "-next" RequestHandler
Request --> "-requestType" RequestType Request --> "-requestType" RequestType
OrcCommander --|> RequestHandler OrcCommander ..|> RequestHandler
OrcOfficer --|> RequestHandler OrcOfficer ..|> RequestHandler
OrcSoldier --|> RequestHandler OrcSoldier ..|> RequestHandler
@enduml @enduml
@@ -24,27 +24,31 @@
*/ */
package com.iluwatar.chain; package com.iluwatar.chain;
import lombok.extern.slf4j.Slf4j;
/** /**
* OrcCommander. * OrcCommander.
*/ */
public class OrcCommander extends RequestHandler { @Slf4j
public class OrcCommander implements RequestHandler {
public OrcCommander(RequestHandler handler) { @Override
super(handler); public boolean canHandleRequest(Request req) {
return req.getRequestType() == RequestType.DEFEND_CASTLE;
} }
@Override @Override
public void handleRequest(Request req) { public int getPriority() {
if (RequestType.DEFEND_CASTLE == req.getRequestType()) { return 2;
printHandling(req);
req.markHandled();
} else {
super.handleRequest(req);
}
} }
@Override @Override
public String toString() { public void handle(Request req) {
req.markHandled();
LOGGER.info("{} handling request \"{}\"", name(), req);
}
@Override
public String name() {
return "Orc commander"; return "Orc commander";
} }
} }
@@ -24,23 +24,34 @@
*/ */
package com.iluwatar.chain; 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. * OrcKing makes requests that are handled by the chain.
*/ */
public class OrcKing { public class OrcKing {
private RequestHandler chain; private List<RequestHandler> handlers;
public OrcKing() { public OrcKing() {
buildChain(); buildChain();
} }
private void 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) { 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; package com.iluwatar.chain;
import lombok.extern.slf4j.Slf4j;
/** /**
* OrcOfficer. * OrcOfficer.
*/ */
public class OrcOfficer extends RequestHandler { @Slf4j
public class OrcOfficer implements RequestHandler {
public OrcOfficer(RequestHandler handler) { @Override
super(handler); public boolean canHandleRequest(Request req) {
return req.getRequestType() == RequestType.TORTURE_PRISONER;
} }
@Override @Override
public void handleRequest(Request req) { public int getPriority() {
if (RequestType.TORTURE_PRISONER == req.getRequestType()) { return 3;
printHandling(req);
req.markHandled();
} else {
super.handleRequest(req);
}
} }
@Override @Override
public String toString() { public void handle(Request req) {
req.markHandled();
LOGGER.info("{} handling request \"{}\"", name(), req);
}
@Override
public String name() {
return "Orc officer"; return "Orc officer";
} }
} }
@@ -24,27 +24,31 @@
*/ */
package com.iluwatar.chain; package com.iluwatar.chain;
import lombok.extern.slf4j.Slf4j;
/** /**
* OrcSoldier. * OrcSoldier.
*/ */
public class OrcSoldier extends RequestHandler { @Slf4j
public class OrcSoldier implements RequestHandler {
public OrcSoldier(RequestHandler handler) { @Override
super(handler); public boolean canHandleRequest(Request req) {
return req.getRequestType() == RequestType.COLLECT_TAX;
} }
@Override @Override
public void handleRequest(Request req) { public int getPriority() {
if (RequestType.COLLECT_TAX == req.getRequestType()) { return 1;
printHandling(req);
req.markHandled();
} else {
super.handleRequest(req);
}
} }
@Override @Override
public String toString() { public void handle(Request req) {
req.markHandled();
LOGGER.info("{} handling request \"{}\"", name(), req);
}
@Override
public String name() {
return "Orc soldier"; return "Orc soldier";
} }
} }
@@ -24,31 +24,16 @@
*/ */
package com.iluwatar.chain; package com.iluwatar.chain;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/** /**
* RequestHandler. * RequestHandler.
*/ */
@Slf4j public interface RequestHandler {
@AllArgsConstructor
public abstract class RequestHandler {
private final RequestHandler next; boolean canHandleRequest(Request req);
/** int getPriority();
* Request handler.
*/
public void handleRequest(Request req) {
if (next != null) {
next.handleRequest(req);
}
}
protected void printHandling(Request req) { void handle(Request req);
LOGGER.info("{} handling request \"{}\"", this, req);
}
@Override String name();
public abstract String toString();
} }