首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Decorator类直接更改最内部包装对象的状态是错误的做法吗?

Decorator类直接更改最内部包装对象的状态是错误的做法吗?
EN

Stack Overflow用户
提问于 2022-08-03 14:46:19
回答 1查看 39关注 0票数 0

通常,根据定义,Decorator模式通过使用修饰类上的装饰器链将新行为附加到对象。该模式利用装饰器链到主装饰类,将传入和传出数据转换为修饰类。

虽然每个装饰器类中都有对直接后续类的引用,但是没有引用实际的修饰类对象(最内部的类)。因此,装饰器类访问或修改修饰类的状态(最内部的类)是不容易的,除非这些信息在装饰器链中传输(这不是很方便)。这对我来说很奇怪,因为装饰模式被认为是继承的动态替代,它允许这种情况发生。子类可以访问和修改父类的状态(如果它们不是私有的),但是在装饰器模式描述中,这不是常规提供的。

所以问题是:装饰师访问链中最内部的类(修饰类)中的数据是不好的做法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 02:43:16

在GoF书的第175页,

装饰器符合它所装饰的组件的接口,因此它的存在对组件的客户端是透明的.透明让你递归地嵌套装饰者..。

因此,一个装饰者不仅对它的客户是透明的,而且对其他装饰者也是透明的。换句话说,一个装饰器不知道它包装的组件是否是另一个装饰器。没有什么不同。

当一个类被设计为继承时,它会选择公开什么和保持什么是私有的。在设计一个装饰器时,它会公开其包装组件公开的所有内容,以便提供GoF引用的透明度。

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

:装饰师访问链中最内部的类(修饰类)中的数据是错误的做法吗?

如果它“符合它所修饰的组件的接口”,那么这是不必要的。如果它不符合,那么它根本就不是一个装饰。这是“好”还是“坏”,完全取决于背景和意见。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73223531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档