행동 패턴: 책임 연쇄 패턴

xellos·2022년 4월 8일
0

디자인 패턴

목록 보기
13/20

소개

요청을 보내는 쪽(Sender)와 요청을 처리하는 쪽(Receiver)을 분리하는 패턴니다.

  • 핸들러 체인을 사용해서 요청을 처리한다.

1) 장점

  1. 클라이언트 코드를 변경하지 않고 새로운 핸들러 체인에 추가할 수 있다.
  2. 각각의 체인은 자신이 해야하는 일만 한다.
  3. 체인을 다양한 방법으로 구성할 수 있다.

2) 단점

  1. 디버깅이 어려워진다.

구현

1) 추상 클래스 구현

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);
        }
    }
}

2) 추상 클래스를 구현하는 구체 클래스 생성

LogRequestProcessor

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);
    }
}

AuthRequestProcessor

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("허가되지 않은 사용자");
        }
    }
}

MainRequestProcessor

public class MainRequestProcessor extends RequestProcessor {
	
    public MainRequestProcessor(RequestProcessor next) {
    	super(next);
    }
    
    @Override
    public void doProcess(Request request) {
    	System.out.println("DB에 접근합니다.");
        super.doProcess(request);
    }
}

3) 보조 클래스

@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();
    }
}

0개의 댓글