Если вы разрабатываете на C ++, вы можете использовать шаблоны.
Вместо того, чтобы извлекать WindowDecorator из Window, вы можете извлечь его из класса, заданного в качестве параметра шаблона, например:
template <typename T>
class WindowDecorator : public T
{
public:
// Put here what you want to decorate
// Every method not implemented here is simply forwarded to T
};
WindowDecorator<MyWindow> mywindow;
Конечно, это делает некоторые предположения:
- Экземпляр, который вы хотите украсить, должен быть «создан» вместе с декоратором
- Все классы, которые вы хотите украсить, имеют конструктор с одинаковыми аргументами
Альтернативой может быть простой класс пересылки, который перенаправляет все вызовы в декорированный класс, например:
class WindowForwarder
{
public:
WindowForwarder (Window &decoratedWindow) : m_decoratedWindow(decoratedWindow) {}
virtual void draw() {m_decoratedWindow.draw();}
// add all forwarding methods here
private:
Window &m_decoratedWindow;
};
Тогда вы можете иметь определенные декораторы в качестве подклассов. Просто наследуйте от WindowForwarder и реализуйте то, что вы хотите отменить. Все, что вы не отменили, будет перенаправлено в оформленное окно, пока WindowForwarder перенаправляет вызовы.