解决的问题
开发一个WebServer,处理Request,处理过程包括Authenticate、Compress和Log步骤。要求可以自由添加或者移除步骤。
代码
Handler:
package com.cong.designpattern.chainOfResponsibility;
public abstract class Handler {
private Handler next;
public Handler(Handler next) {
this.next = next;
}
public void handle(Request request) {
if (!doHandle(request)) return;
if (this.next != null) this.next.handle(request);
}
protected abstract boolean doHandle(Request request);
}
WebServer:
package com.cong.designpattern.chainOfResponsibility;
public class WebServer {
private Handler handler;
public WebServer(Handler handler) {
this.handler = handler;
}
public void handleRequest(Request request) {
this.handler.handle(request);
}
}
Request:
package com.cong.designpattern.chainOfResponsibility;
public class Request {
public String account;
public String password;
public Request(String account, String password) {
this.account = account;
this.password = password;
}
}
Authenticator:
package com.cong.designpattern.chainOfResponsibility;
public class Authenticator extends Handler {
public Authenticator(Handler next) {
super(next);
}
@Override
protected boolean doHandle(Request request) {
System.out.println("Authentication");
return request.account.equals("a") && request.password.equals("1234");
}
}
Compressor:
package com.cong.designpattern.chainOfResponsibility;
public class Compressor extends Handler {
public Compressor(Handler next) {
super(next);
}
@Override
protected boolean doHandle(Request request) {
System.out.println("Compress");
return true;
}
}
Logger:
package com.cong.designpattern.chainOfResponsibility;
public class Logger extends Handler{
public Logger(Handler next) {
super(next);
}
@Override
protected boolean doHandle(Request request) {
System.out.println("Log");
return true;
}
}
Test code:
// authenticator -> compressor -> logger
Logger logger = new Logger(null);
Compressor compressor = new Compressor(logger);
Authenticator authenticator = new Authenticator(compressor);
WebServer webServer = new WebServer(authenticator);
Request request = new Request("a", "1234");
webServer.handleRequest(request);
UML

Chain Of Responsibility Pattern UML