2014-01-17 5 views
1

나는 몇 가지 기능을 클래스 A있어 :데코레이터 패턴을 올바르게 사용하고 있습니까?

class A < B { 
    private some_data; 
    public start() { ... }; 
} 

클래스 BA 같은 여러 클래스의 기본 클래스입니다. 특별하지 않고 클래스 C에서 상속됩니다.

abstract class decoratorC < C { 
    private C; 
    public construct() { 
     self->C->start(); 
    } 
} 

그리고 구체적인 장식 :

abstract class C { 
    abstract public start(); 
} 

내가 추상 장식이있어

class ConcreteDecoratorForA < decoratorC { 
    public start() { 
     parent->start(); 
     // code here 
    } 
} 

을 따라서 문제는 : 나는 클래스 A에서의 개인 특성 및 필요 "여기 코드"섹션 및 클래스 B의 기능도 있습니다.

어딘가에서 아키텍처 실수가 발생했습니다. 클래스 B 주위에서 구조를 다시 제작해야 할 수도 있습니다.

답변

1

이론상 데코레이터는 꾸미는 클래스의 속성에 액세스해서는 안됩니다. 데코레이터의 개념은 정상적인 동작 위에 기능을 제공하는 것입니다.

예를 들어 전자 메일을 보내는 클래스가있을 수 있습니다. 그런 다음 다른 클래스 인 데코레이터를 사용하여 메시지를 먼저 기록한 다음 데코 레이팅 된 클래스를 사용하여 전자 메일을 보냅니다.

장식자가 장식하는 클래스의 속성에 액세스해서는 안되는 이유는 꾸미는 클래스를 모르는 것입니다. 필자의 전자 메일 및 로깅 예제에서는 보안 사이에 또 ​​다른 계층을 상상할 수 있습니다. 그래서 당신은 다음과 같은 구조 것이다 :

로깅 -> 보안 - 데코레이터가 장식 된 클래스와 동일한 인터페이스를 구현하기> 메일을

을 보내,이 체인은 원하는 방식으로 구성 할 수 있습니다.

데코 레이팅 한 클래스의 데이터에 액세스하려면 해당 데이터 부분을 계약서 (예 : C)로 만들어야합니다. 하위 클래스에만 해당되는 경우 클래스가 제네릭이 아니므로 데코레이터가 작동하지 않습니다.

관련 문제