요청을 보내는 쪽(Sender)와 요청을 처리하는 쪽(Receiver)을 분리하는 패턴니다.
public abstract class RequestProcessor {
private RequestProcessor next;
public RequestProcessor(RequestProcessor next) {
this.next = next;
}
public void doProcess(Request request) {
if(next != null) {
next.doProcess(request);
}
}
}
public class LogRequestProcessor extends RequestProcessor {
public LogRequestProcessor(RequestProcessor next) {
super(next);
}
@Override
public void doProcess(Request request) {
System.out.println("[Log] 실행시간: " + System.currentTimeMillis());
super.doProcess(request);
}
}
public class AuthRequestProcessor extends RequestProcessor {
public AuthRequestProcessor(RequestProcessor next) {
super(next);
}
@Override
public void doProcess(Request request) {
if(request.getUser().equals("ADMIN")) {
System.out.println("사용자 인증 처리");
super.doProcess(request);
} else {
throw new RuntimeException("허가되지 않은 사용자");
}
}
}
public class MainRequestProcessor extends RequestProcessor {
public MainRequestProcessor(RequestProcessor next) {
super(next);
}
@Override
public void doProcess(Request request) {
System.out.println("DB에 접근합니다.");
super.doProcess(request);
}
}
@Getter
public class Request {
private String msg;
private String user;
public Request(String msg, String user) {
this.msg = msg;
this.user = user;
}
}
public class Client {
private RequestProcessor requestProcessor;
private Client(requestProcessor requestProcessor) {
this.requestProcessor = requestProcessor;
}
public void doWork() {
Request request = new Request("DB 접근", "ADMIN");
requestProcessor.doProcess(request);
}
public static void main(String[] args) {
RequestProcessor chain = new LogRequestProcessor(
new AuthRequestProcessor(
new MainRequestProcessor(null)));
Client client = new Client(chain);
client.doWork();
}
}