프록시와 데코레이터 패턴의 차이점
Proxy 와 Decorator 의 차이점에 대해 설명해 주 시겠습니까?
내가 보는 주요 차이점은 Proxy 가 컴포지션을 사용 하고 Decorator 가 집계 를 사용 한다고 가정 하면 여러 (하나 이상의) Decorator 를 사용하여 기존 인스턴스 (decorate)에 기능을 수정 / 추가 할 수 있다는 것이 분명해 보입니다. 프록시 에는 프록시 클래스의 내부 인스턴스가 있으며 여기에 몇 가지 추가 기능 (프록시 동작)을 추가하는 위임이 있습니다.
문제는 -합니까 프록시는 집계가 아직 만들어 프록시 또는 오히려 실내 장식 ? 집계 를 사용하여 프록시 를 만드는 것이 허용 됩니까 ( GoF 패턴의 정의에 따라) ?
데코레이터 패턴은 객체에 동적으로 기능을 추가하는 데 초점을 맞추고 프록시 패턴은 객체에 대한 액세스를 제어하는 데 중점을 둡니다.
편집하다:-
프록시 와 실제 주제 사이의 관계 는 일반적으로 컴파일 시간에 설정되고 프록시 는 어떤 방식 으로든 인스턴스화하는 반면 Decorator 는 주제의 인터페이스 만 알고 런타임에 주제에 할당됩니다.
받아 들여지는 대답은 정확하지 않습니다. 실제 차이점은 소유권 (구성 대 집계)이 아니라 형식 정보입니다.
실내 장식이 되어 항상 그 위임자을 통과시켰다. 프록시 수 그것을 자신을 만들거나 그 수 는 주사 있습니다.
그러나 프록시는 항상 (더 많은) 대리인 유형을 알고 있습니다. 즉, 프록시 와 해당 대리자는 동일한 기본 유형을 가지지 만 프록시 는 일부 파생 유형을 가리 킵니다. 데코레이터는 자신의 기본 유형을 가리키는. 따라서 차이점은 대리자 유형에 대한 컴파일 타임 정보입니다.
동적 언어에서 델리게이트가 주입되고 동일한 인터페이스를 갖게되면 차이가 없습니다.
귀하의 질문에 대한 대답은 "예"입니다.
장식 동안 (보통 생성자를 통해) 장식 개체에 대한 GET 참조 프록시 책임은 자신이 그 작업을 수행하는.
데코레이터는 항상 실제 래핑 된 인스턴스에 대한 링크를 보유 하는 동안 프록시 는 래핑 개체를 전혀 인스턴스화하지 않을 수 있습니다 (예 : 개체 필드 / 게터가 사용되지 않는 경우 DB에 대한 불필요한 액세스를 방지하기 위해 ORM을 수행함) .
프록시는 일반적으로 프레임 워크에 의해 (안 일반 개발자 자체) 보안 또는 캐시 /에 lazing를 추가하는 프레임 워크에 의해 사용 및 구성.
데코레이터는 일반적으로 실제 클래스가 아닌 인터페이스를 기반으로 개발자 자체가 기존 또는 레거시 클래스에 새로운 동작을 추가하는 데 사용됩니다 (따라서 광범위한 인터페이스 인스턴스에서 작동하며 프록시 는 구체적인 클래스를 중심으로합니다).
주요 차이점 :
- 프록시 는 동일한 인터페이스를 제공합니다. Decorator 는 향상된 인터페이스를 제공합니다.
- 데코레이터 와 프록시 는 용도는 다르지만 구조는 비슷합니다. 둘 다 다른 객체에 대한 간접 수준을 제공하는 방법을 설명하고 구현은 요청을 전달하는 객체에 대한 참조를 유지합니다.
- 데코레이터 는 하나의 구성 요소 만있는 퇴화 합성물로 볼 수 있습니다. 그러나 Decorator는 추가적인 책임을 추가합니다 . 이것은 객체 집계를위한 것이 아닙니다.
- 데코레이터 는 재귀 적 구성을 지원합니다.
- 데코레이터 클래스가 선언 조성물 액정 (최저 등급 분모) 인터페이스에 관계하고,이 데이터가 부재 생성자에서 초기화된다.
- 프록시 를 사용 하여 지연 초기화, 개체 캐싱 및 클라이언트 / 호출자에 대한 액세스 제어를 통한 성능 향상
Sourcemaking 기사는 유사점과 차이점을 훌륭하게 인용합니다.
관련 SE 질문 / 링크 :
프록시와 데코레이터는 목적과 내부 구현에 중점을 둔 부분이 다릅니다. 프록시는 마치 로컬 개체 인 것처럼 원격, 교차 프로세스 또는 교차 네트워크 개체를 사용하기위한 것입니다. 데코레이터는 원래 인터페이스에 새로운 동작을 추가하기위한 것입니다.
두 패턴의 구조는 비슷하지만 Proxy의 복잡성은 소스 객체와의 적절한 통신을 보장하는 데 있습니다. 반면 데코레이터는 추가 된 동작의 구현에 중점을 둡니다.
참고 URL : https://stackoverflow.com/questions/18618779/differences-between-proxy-and-decorator-pattern
'programing tip' 카테고리의 다른 글
델리게이트는 어디에서 사용합니까? (0) | 2020.08.13 |
---|---|
64 비트 OS에서 32 비트 JVM의 최대 Java 힙 크기 (0) | 2020.08.13 |
Map Reduce Programming의 감속기에서 셔플 링 및 정렬 단계의 목적은 무엇입니까? (0) | 2020.08.13 |
진행 중입니다. (0) | 2020.08.13 |
왜 float 값을 템플릿 매개 변수로 사용할 수 없습니까? (0) | 2020.08.13 |