样例
import java.util.Objects;
public class Request {
private final RequestType requestType;
private final String requestDescription;
private boolean handled;
public Request(RequestType requestType, String requestDescription) {
this.requestType = Objects.requireNonNull(requestType);
this.requestDescription = Objects.requireNonNull(requestDescription);
}
public RequestType getRequestType() {
return requestType;
}
public String getRequestDescription() {
return requestDescription;
}
public void markHandled(){
this.handled = true;
}
public boolean isHandled(){
return this.handled;
}
@Override
public String toString() {
return getRequestDescription();
}
}
public enum RequestType {
DEFEND_CASTLE,
TORTURE_PRISONER,
COLLECT_TAX;
}
public interface RequestHandler {
boolean canHandleRequest(Request request);
int getPriority();
void handle(Request request);
String name();
}
public class OrcCommander implements RequestHandler{
@Override
public boolean canHandleRequest(Request request) {
return request.getRequestType() == RequestType.DEFEND_CASTLE;
}
@Override
public int getPriority() {
return 2;
}
@Override
public void handle(Request request) {
request.markHandled();
System.out.println("Orc Commander handled request : " + name() + " : " + request);
}
@Override
public String name() {
return "orc commander";
}
}
public class OrcOfficer implements RequestHandler{
@Override
public boolean canHandleRequest(Request request) {
return request.getRequestType() == RequestType.COLLECT_TAX;
}
@Override
public int getPriority() {
return 3;
}
@Override
public void handle(Request request) {
request.markHandled();
System.out.println("Orc Officer collects taxes : " + name() + " : " + request);
}
@Override
public String name() {
return "Orc Officer";
}
}
public class OrcSoldier implements RequestHandler{
@Override
public boolean canHandleRequest(Request request) {
return request.getRequestType() == RequestType.TORTURE_PRISONER;
}
@Override
public int getPriority() {
return 4;
}
@Override
public void handle(Request request) {
request.markHandled();
System.out.println("Orc Soldier torturing prisoner : " + name() + " : " + request);
}
@Override
public String name() {
return "Orc Soldier";
}
}
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class OrcKing{
private List<RequestHandler> handlers;
public OrcKing() {
buildChain();
}
private void buildChain(){
handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier());
}
public void makeRequest(Request request){
handlers
.stream()
.sorted(Comparator.comparing(RequestHandler::getPriority))
.filter(handlers -> handlers.canHandleRequest(request))
.findFirst()
.ifPresent(handler -> handler.handle(request));
}
}
//测试
public class Main {
public static void main(String[] args) {
var king = new OrcKing();
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle"));
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner"));
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax"));
}
}