mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-08-15 18:23:54 +00:00
This commit is contained in:
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user