2014-01-17 4 views
1

У меня есть класс A с некоторыми функциональными возможностями:Я использую шаблон декоратора правильно?

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

Класс B является базовым классом для нескольких классов, таких как A. Ничего особенного, он наследует от класса C.

abstract class C { 
    abstract public start(); 
} 

У меня есть абстрактный декоратор:

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

И конкретный декоратор:

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

Так что проблема: мне нужно личные свойства и такие из класса A в раздел «код здесь» и функциональность от класса B.

У меня есть ошибка архитектуры где-то, это может быть очевидно для нового вида. Возможно, мне нужно переделать структуру вокруг класса B.

ответ

1

Теоретически декоратор не должен обращаться к свойствам класса, который он украшает. Идея декоратора - обеспечить функциональность поверх нормального поведения.

Например, у вас может быть класс, который отправляет электронное письмо. Тогда у вас будет другой класс, декоратор, который первым регистрирует сообщение, а затем использует украшенный класс для отправки электронной почты.

Причина, по которой декораторы не должны получать доступ к свойствам класса, который он украшает, заключается в том, что он не знает, какой класс он украшает. В моем примере электронной почты и регистрации вы можете представить себе еще один слой между ними (скажем, безопасность). Таким образом, вы бы иметь следующую структуру:

Logging -> Безопасность -> Отправить сообщение

Поскольку декоратор реализует тот же интерфейс, украшенный класса, эта цепочка может быть построена в любом случае вы хотите.

Если вы хотите получить доступ к данным из класса, который вы украсили, вы должны сделать эту часть данных контракта (C в вашем примере). Если это специфично для подкласса, то декоратор не будет работать, потому что ваш класс не является общим.

Смежные вопросы