我正确使用装饰图案吗?

时间:2014-01-17 10:03:52

标签: oop decorator

我的课程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
    }
}

所以问题是:我需要私有属性,例如来自“{code 1”}的“{here 1”}部分和类A中的功能。

我在某个地方遇到了架构错误,看起来很新鲜。也许我需要在类B周围重新构建结构。

1 个答案:

答案 0 :(得分:1)

理论上,装饰器不应该访问它所装饰的类的属性。装饰器的想法是在正常行为之上提供功能。

例如,您可以拥有一个发送电子邮件的课程。然后你会有另一个类,即装饰器,它首先记录消息,然后使用装饰类发送电子邮件。

装饰器不应该从它所装饰的类中访问属性的原因是它不知道它正在装饰哪个类。在我的电子邮件和日志记录示例中,您可以想象其中的另一层(比如安全性)。所以你将拥有以下结构:

记录 - &gt;安全 - &gt;发送邮件

由于装饰器实现了与装饰类相同的接口,因此可以以您想要的任何方式构造此链。

如果要访问所装饰类的数据,则应将该数据作为合同的一部分(在您的示例中为C)。如果它特定于子类,则装饰器将不起作用,因为您的类不是通用的。