Open hj-k66 opened 7 months ago
자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것을 프록시라고 한다고 합니다. 또한, 프록시의 특징은 타깃과 같은 인터페이스를 구현했다는 것과 프록시가 타깃을 제어할 수 있는 위치에 있다는 것입니다. 데코레이션을 구현할 때 다른 인터페이스를 사용한다라는 것은 프록시의 정의에 맞지 않는 것 같습니다.
위의 사진에서의 경우에는 다른 인터페이스를 사용할 경우에도 목적을 달성할 수 있지 않을까라고 생각은 합니다. 하지만 데코레이션을 사용하는 이유는 중간에 여러 데코레이션을 필요할 때마다 쉽게 삽입 삭제할 수 있다는 것이 장점이라고 생각이 들었습니다. 만약 다른 인터페이스를 사용할 경우 다음 위임하는 대상의 인터페이스를 확인하고 호출해야하기 때문에 좋은 방식은 아니라고 생각합니다.
제가 찾아봤을 때도 코드의 실행이 안되는 것은 아니지만, 데코레이터 패턴의 핵심은 객체가 동일한 인터페이스를 유지하는 것이기 때문에 중간에 들어가는 데코레이터의 인터페이스가 달라진다면, 그것은 데코레이터 패턴을 사용했다고 볼 수 없다고 나왔습니다.
데코레이터 패턴에서 객체가 동일한 인터페이스를 유지해야 하는 이유는, 위에서 아영님이 설명한 것 처럼 데코레이터를 추가하거나, 삭제하거나, 순서를 바꾸는 상황이 생길 때, 클라이언트 코드에 영향을 주지 않아야 하기 때문이라고 이해했습니다.
예를 들어, 클라이언트 -> 데코레이터1(A의 구현체) -> 데코레이터2(B의 구현체) -> 타겟 객체(A의 구현체)의 구조로 데코레이터 패턴을 만들었다고 가정했을 때, 데코레이터1과 2의 순서를 바꾸면 클라이언트 코드에서 인터페이스 A를 통해 객체를 사용하는 코드를 인터페이스 B를 사용하도록 바꿔야 합니다.
데코레이터 패턴에서 타깃에 부가 기능을 부여하기 위해 프록시를 사용하는데, 이때 프록시는 여러 개 올 수 있다고 합니다. 프록시로 동작하는 각 데코레이터는 다음 위임하는 대상이 명확하지 않기 때문에 인터페이스로 선언해 외부에서 런타임 시 DI하게 만들어야 한다고 합니다.
이때 궁금한게 각 단계별 데코레이터의 모든 인터페이스를 하나로 통일해야하는 것일까요? 위 예시에서
클라이언트
는 타깃은소스코드 출력 기능
을 사용하는 것처럼 보여야 하므로소스코드 출력 기능
과라인넘버 데코레이터
는 같은 인터페이스를 사용해야할 것 같은데, 가운데컬러 데코레이터
와페이징 데코레이터
는 다른 인터페이스를 써도 데코레이터의 본래 목적은 달성할 수 있지 않을까?라는 생각이 듭니다. 다른 분들은 어떻게 생각하시는지 궁금합니다!