通常,根据定义,Decorator模式通过使用修饰类上的装饰器链将新行为附加到对象。该模式利用装饰器链到主装饰类,将传入和传出数据转换为修饰类。
虽然每个装饰器类中都有对直接后续类的引用,但是没有引用实际的修饰类对象(最内部的类)。因此,装饰器类访问或修改修饰类的状态(最内部的类)是不容易的,除非这些信息在装饰器链中传输(这不是很方便)。这对我来说很奇怪,因为装饰模式被认为是继承的动态替代,它允许这种情况发生。子类可以访问和修改父类的状态(如果它们不是私有的),但是在装饰器模式描述中,这不是常规提供的。
所以问题是:装饰师访问链中最内部的类(修饰类)中的数据是不好的做法吗?
发布于 2022-08-04 02:43:16
在GoF书的第175页,
装饰器符合它所装饰的组件的接口,因此它的存在对组件的客户端是透明的.透明让你递归地嵌套装饰者..。
因此,一个装饰者不仅对它的客户是透明的,而且对其他装饰者也是透明的。换句话说,一个装饰器不知道它包装的组件是否是另一个装饰器。没有什么不同。
当一个类被设计为继承时,它会选择公开什么和保持什么是私有的。在设计一个装饰器时,它会公开其包装组件公开的所有内容,以便提供GoF引用的透明度。
因此,如果一个对象提供修改其状态的访问权限,那么任何装饰器都将提供相同的访问;“此信息在装饰器链中传输”,但这与任何其他修饰方法都没有区别。
:装饰师访问链中最内部的类(修饰类)中的数据是错误的做法吗?
如果它“符合它所修饰的组件的接口”,那么这是不必要的。如果它不符合,那么它根本就不是一个装饰。这是“好”还是“坏”,完全取决于背景和意见。
https://stackoverflow.com/questions/73223531
复制相似问题