在实现了装饰器模式并编写了几个装饰器之后,我注意到API允许用户堆叠不兼容的装饰器。这是API设计者应该接受的模式的自然约束,还是我对模式的错误实现?
例如,假设有一个类可以用二进制装饰器或字符串装饰器来装饰,前者将数据编码为二进制,后者将数据编码为字符串。由于使用了字符串装饰器,因此可以进一步使用JSON或XML装饰器对其进行装饰。现在很明显,在应用了JSON装饰器之后,在它上面使用XML装饰器是不兼容的,或者如果使用了二进制装饰器,那么XML/JSON装饰器就没有用处了。
使用java.io包的Java示例:
InputStream is = someInputStream;
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);
DataInputStream dis = new DataInputStream(ois);此操作的结果未定义,但API允许它。
发布于 2011-05-27 16:27:20
装饰器使得组合功能变得很容易。组合的功能是否有任何意义取决于API用户。
发布于 2011-05-27 16:28:44
Java类似乎违反了一个或多个OO设计原则,如Interface Segregation Principle和Liskov Substitution Principle,并滥用了实现继承。如果ObjectInputStream和DataInputStream不从InputStream继承,那么它们只能拥有那些允许在其上使用的方法。通过实现继承实现的代码重用可能是导致这个问题的原因--它本可以通过偏爱组合而不是继承来避免。
发布于 2011-05-27 16:09:51
据我所知,这种约束强制不是装饰器模式的一部分,但没有理由不能这样做。它是API的简单性和安全性之间的折衷(由于程序员的错误)。
https://stackoverflow.com/questions/6149384
复制相似问题