Java/Design Pattern

[헤드퍼스트 디자인 패턴] 12-3. 책임 연쇄 패턴

noahkim_ 2024. 12. 19. 00:17

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다


1. 책임 연쇄 패턴

  • 1개의 요청을 2개 이상의 객체에서 처리해야 할 경우 사용되는 패턴

 

객체 사슬
  • 순차적으로 요청을 처리함
  • 자신이 처리할 수 있는 요청만 처리
    • 나머지는 다음 객체에 위임

 

장점

  • 요청을 보낸 쪽과 받는 쪽을 분리할 수 있음
  • 사슬을 동적으로 수정할 수 있음

 

2. RemoteControl

public class RemoteControl {
    private Handler handlerChain;

    public void setHandlerChain(Handler handlerChain) {
        this.handlerChain = handlerChain;
    }

    public void pressButton(String request) {
        if (handlerChain != null) {
            handlerChain.handleRequest(request);
        } else {
            System.out.println("RemoteControl: 요청을 처리할 핸들러가 없습니다.");
        }
    }
}

 

Handler

public interface Handler {
    void setNext(Handler nextHandler); // 다음 체인 연결
    void handleRequest(String request); // 요청 처리
}
public class SpanHandler implements Handler {
    private Handler nextHandler;

    @Override
    public void setNext(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(String request) {
        if (request.equalsIgnoreCase("SPAN")) {
            System.out.println("SpanHandler: SPAN 요청을 처리했습니다.");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("SpanHandler: 요청을 처리할 핸들러가 없습니다.");
        }
    }
}
public class FanHandler implements Handler {
    private Handler nextHandler;

    @Override
    public void setNext(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(String request) {
        if (request.equalsIgnoreCase("FAN")) {
            System.out.println("FanHandler: FAN 요청을 처리했습니다.");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("FanHandler: 요청을 처리할 핸들러가 없습니다.");
        }
    }
}