【问题标题】:Is it bad practice for a Decorator Class to change the state of the innermost wrapped object装饰器类改变最里面的包装对象的状态是不好的做法吗
【发布时间】:2022-08-04 10:43:16
【问题描述】:
通常,根据定义,装饰器模式通过在装饰类上使用装饰器链将新行为附加到对象。该模式利用主装饰类的装饰器链将传入和传出数据转换为装饰类。
尽管在每个装饰器类中都有对直接后继者的引用,但没有对实际装饰类对象(最内层类)的引用。因此,装饰器类没有简单的方法可以访问或修改被装饰类的状态(最内层的类),除非此信息在装饰器链中传输(这不是很方便)。
这对我来说很奇怪,因为装饰器模式被认为是继承的动态替代方案,它允许这种情况发生。子类可以访问和修改父类的状态(如果它们不是私有的)但是在装饰器模式描述中并没有方便地提供。
所以问题是:装饰器访问链中最里面的类(装饰类)中的数据是不好的做法吗?
标签:
design-patterns
decorator
【解决方案1】:
在 GoF 书的第 175 页上,
装饰器符合它所装饰的组件的接口,因此它的存在对组件的客户端是透明的......透明性让您可以递归地嵌套装饰器......
所以一个装饰器不仅对它的客户是透明的,对其他装饰器也是透明的。换句话说,一个装饰器不知道它包装的组件是否是另一个装饰器。没有区别。
当一个类是为继承而设计时,它会选择公开什么和保持私有。设计装饰器时,它会公开其包装组件公开的所有内容,以提供 GoF 引用的透明度。
因此,如果一个对象提供了修改其状态的访问权限,那么任何装饰器都将提供相同的访问权限; "此信息在装饰器链中传输” 但这与任何其他装饰方法没有什么不同。
装饰器访问链中最里面的类(装饰类)中的数据是不好的做法吗?
如果它“符合它所装饰的组件的接口”,那么这是不必要的。如果它不符合,那么它根本就不是装饰器。这是“好”还是“坏”完全取决于上下文和观点。