【问题标题】: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 引用的透明度。

    因此,如果一个对象提供了修改其状态的访问权限,那么任何装饰器都将提供相同的访问权限; "此信息在装饰器链中传输” 但这与任何其他装饰方法没有什么不同。

    装饰器访问链中最里面的类(装饰类)中的数据是不好的做法吗?

    如果它“符合它所装饰的组件的接口”,那么这是不必要的。如果它不符合,那么它根本就不是装饰器。这是“好”还是“坏”完全取决于上下文和观点。

    【讨论】:

      猜你喜欢
      • 2020-12-20
      • 1970-01-01
      • 2019-10-17
      • 2019-06-11
      • 2017-05-13
      • 2016-11-25
      • 2011-02-14
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多