SSAFY11th-book-study / book-study

0 stars 0 forks source link

[6.3.1] 데코레이터 패턴에서의 인터페이스 #59

Open hj-k66 opened 4 months ago

hj-k66 commented 4 months ago

데코레이터 패턴에서 타깃에 부가 기능을 부여하기 위해 프록시를 사용하는데, 이때 프록시는 여러 개 올 수 있다고 합니다. 프록시로 동작하는 각 데코레이터는 다음 위임하는 대상이 명확하지 않기 때문에 인터페이스로 선언해 외부에서 런타임 시 DI하게 만들어야 한다고 합니다.

이때 궁금한게 각 단계별 데코레이터의 모든 인터페이스를 하나로 통일해야하는 것일까요? IMG_1177025123B5-1 위 예시에서 클라이언트는 타깃은 소스코드 출력 기능을 사용하는 것처럼 보여야 하므로 소스코드 출력 기능라인넘버 데코레이터는 같은 인터페이스를 사용해야할 것 같은데, 가운데 컬러 데코레이터페이징 데코레이터는 다른 인터페이스를 써도 데코레이터의 본래 목적은 달성할 수 있지 않을까?라는 생각이 듭니다. 다른 분들은 어떻게 생각하시는지 궁금합니다!

a-young-kim commented 4 months ago
  1. 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것을 프록시라고 한다고 합니다. 또한, 프록시의 특징은 타깃과 같은 인터페이스를 구현했다는 것과 프록시가 타깃을 제어할 수 있는 위치에 있다는 것입니다. 데코레이션을 구현할 때 다른 인터페이스를 사용한다라는 것은 프록시의 정의에 맞지 않는 것 같습니다.

  2. 위의 사진에서의 경우에는 다른 인터페이스를 사용할 경우에도 목적을 달성할 수 있지 않을까라고 생각은 합니다. 하지만 데코레이션을 사용하는 이유는 중간에 여러 데코레이션을 필요할 때마다 쉽게 삽입 삭제할 수 있다는 것이 장점이라고 생각이 들었습니다. 만약 다른 인터페이스를 사용할 경우 다음 위임하는 대상의 인터페이스를 확인하고 호출해야하기 때문에 좋은 방식은 아니라고 생각합니다.

sootudio commented 4 months ago

제가 찾아봤을 때도 코드의 실행이 안되는 것은 아니지만, 데코레이터 패턴의 핵심은 객체가 동일한 인터페이스를 유지하는 것이기 때문에 중간에 들어가는 데코레이터의 인터페이스가 달라진다면, 그것은 데코레이터 패턴을 사용했다고 볼 수 없다고 나왔습니다.

데코레이터 패턴에서 객체가 동일한 인터페이스를 유지해야 하는 이유는, 위에서 아영님이 설명한 것 처럼 데코레이터를 추가하거나, 삭제하거나, 순서를 바꾸는 상황이 생길 때, 클라이언트 코드에 영향을 주지 않아야 하기 때문이라고 이해했습니다.

예를 들어, 클라이언트 -> 데코레이터1(A의 구현체) -> 데코레이터2(B의 구현체) -> 타겟 객체(A의 구현체)의 구조로 데코레이터 패턴을 만들었다고 가정했을 때, 데코레이터1과 2의 순서를 바꾸면 클라이언트 코드에서 인터페이스 A를 통해 객체를 사용하는 코드를 인터페이스 B를 사용하도록 바꿔야 합니다.