样例
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;}@Overridepublic 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{@Overridepublic boolean canHandleRequest(Request request) {return request.getRequestType() == RequestType.DEFEND_CASTLE;}@Overridepublic int getPriority() {return 2;}@Overridepublic void handle(Request request) {request.markHandled();System.out.println("Orc Commander handled request : " + name() + " : " + request);}@Overridepublic String name() {return "orc commander";}
}
public class OrcOfficer implements RequestHandler{@Overridepublic boolean canHandleRequest(Request request) {return request.getRequestType() == RequestType.COLLECT_TAX;}@Overridepublic int getPriority() {return 3;}@Overridepublic void handle(Request request) {request.markHandled();System.out.println("Orc Officer collects taxes : " + name() + " : " + request);}@Overridepublic String name() {return "Orc Officer";}
}
public class OrcSoldier implements RequestHandler{@Overridepublic boolean canHandleRequest(Request request) {return request.getRequestType() == RequestType.TORTURE_PRISONER;}@Overridepublic int getPriority() {return 4;}@Overridepublic void handle(Request request) {request.markHandled();System.out.println("Orc Soldier torturing prisoner : " + name() + " : " + request);}@Overridepublic 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"));}
}
