首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >装饰装饰器

装饰装饰器
EN

Stack Overflow用户
提问于 2011-05-27 15:56:45
回答 3查看 504关注 0票数 5

在实现了装饰器模式并编写了几个装饰器之后,我注意到API允许用户堆叠不兼容的装饰器。这是API设计者应该接受的模式的自然约束,还是我对模式的错误实现?

例如,假设有一个类可以用二进制装饰器或字符串装饰器来装饰,前者将数据编码为二进制,后者将数据编码为字符串。由于使用了字符串装饰器,因此可以进一步使用JSON或XML装饰器对其进行装饰。现在很明显,在应用了JSON装饰器之后,在它上面使用XML装饰器是不兼容的,或者如果使用了二进制装饰器,那么XML/JSON装饰器就没有用处了。

使用java.io包的Java示例:

代码语言:javascript
运行
复制
InputStream is = someInputStream;
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);
DataInputStream dis = new DataInputStream(ois);

此操作的结果未定义,但API允许它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-27 16:27:20

装饰器使得组合功能变得很容易。组合的功能是否有任何意义取决于API用户。

票数 1
EN

Stack Overflow用户

发布于 2011-05-27 16:28:44

Java类似乎违反了一个或多个OO设计原则,如Interface Segregation PrincipleLiskov Substitution Principle,并滥用了实现继承。如果ObjectInputStream和DataInputStream不从InputStream继承,那么它们只能拥有那些允许在其上使用的方法。通过实现继承实现的代码重用可能是导致这个问题的原因--它本可以通过偏爱组合而不是继承来避免。

票数 1
EN

Stack Overflow用户

发布于 2011-05-27 16:09:51

据我所知,这种约束强制不是装饰器模式的一部分,但没有理由不能这样做。它是API的简单性和安全性之间的折衷(由于程序员的错误)。

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

https://stackoverflow.com/questions/6149384

复制
相关文章

相似问题

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