Chain of Responsibility 패턴

Jimin K·2023년 6월 7일
0

디자인 패턴

목록 보기
3/4

JAVA 언어로 배우는 디자인패턴 입문 책의 교재 및 예제 풀이를 정리해보려 한다.

--

Chain of Responsibility 패턴은 여러 객체를 사슬처럼 연쇄적으로 묶고, 객체 사슬을 차례대로 돌면서 원하는 객체를 결정하는 패턴이다.

책임을 떠넘기는 구조이다.
요청을 해당 사람이 해결할 수 있으면 하고, 못하면 다음 사람으로 넘기는 구조이다.

이 패턴의 구조는 크게 3개로 나뉜다.
Hander - 처리자 : 요구를 처리하는 인터페이스를 정의
ConcreteHandler - 구체적 처리자 : 요구를 구체적으로 처리한다.
Client - 요구자 : 첫 번째 구체적 처리자에게 요구를 한다.

교재의 예제는 난수를 발행시키고, 지정 번호 미만의 문제를 해결하거나 홀수 번호 문제만 해결하는 등 특정 조건일 경우만 해결하는 클래스를 생성해 여러 클래스로 넘기는 구조로 이루어진다.

교재는 Main을 포함해서 7개의 클래스로 이루어져 있다. 그런데 4개의 클래스는 비슷한 맥락이다.

Trouble, Support, NoSupport, LimitSupport, OddSupport, SpecialSupport, Main 이렇게 구성된다.

그중 NoSupport, LimitSupport, OddSupport, SpecialSupport 이 4가지는 모두 Support로부터 상속받는다.

자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
https://www.youngin.com/reader/pds/pds.asp


문제 1 : GUI 앱 상에는 버튼, 텍스트 상자, 체크방스 등 컴포넌트가 있다. 이 컴포넌트를 클릭했을 때 발생하는 이벤트를 어떻게 떠넘기나. next는 어디에 등장하나.

부모 컴포넌트가 next가 되는 경우가 많다.
next는 그 다음 대상자를 의미한다.
컴포넌트로 전달된 이벤트는 해당 컴포넌트가 처리하지 않을 때 순차적으로 부모 컴포넌트로 전달된다.

문제 2 : 예제 프로그램의 support에서 support 메소드는 public 이지만, resolve 메소드는 protected 이다. 클래스 설계자가 이와 같이 구분한 의도는 무엇인가.

public은 여러 클래스에서 이용 가능 한 것을 의미한다.
protected는 해당 패키지 및 하위 클래스에서 접근 가능한 것을 의미한다.

resolve 메소드는 support 클래스 내부에 생성된 메소드인데,
다른 클래스가 트러블 해결을 의뢰할 때는 resolve가 아닌 support 메소드를 사용하길 바란다는 의도다.

support 클래스와 관계 없는 클래스에서 resolve를 호출해 사용하지 못하게 막기 위함이다.

또한 resolve 메소드의 이름 등을 변환할 때 수정할 대상이 많이져 번거로워지기 때문이다.

문제 3 : 예제 프로그램의 support 메소드를 재귀적으로 호출하는 대신 루프로 전개 해라.

기존의 support 메소드는 아래와 같다.

public void support (Trouble trouble) {
    if ( resolve(trouble)) {
        done(trouble);
    } else if ( next != null) {
        next.support(trouble);
    } else {
        fail(trouble);
    }
}

for 문의 반복 조건을 true로 둠으로서 - 루프를 통해서 이를 전개할 수 있다.

pubilc void Support(Trouble troublee){
  for (Support obj = this; true; obj = obj.next) {
      if (obj.resolve(trouble)) {		// 만약 문제를 해결할 수 있다면
          obj.done(troble);			// 해당 Solve클래스로 해결했음을 출력하는 done 메소드를 부르고
          break;						// 빠져나온다.
      } else if (obj.next == null) {	// 만약 다음 Solve 메소드가 없다면.
          obj.fail(trouble);			// 해결되지 않다는 문구를 출력한다.
          break;						// 그리고 빠져나온다. 
      }
  }
}
profile
아둥바둥

0개의 댓글