2011-05-27 251 views
5

在实现了装饰器模式并编写了一对装饰器之后,我注意到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允许它。

+1

为什么不能以可用的任何格式对类进行编码,具体取决于传递给编码方法的参数还是单独的方法调用本身?为什么用JSON装饰器装饰类使其与XML装饰器不兼容? – Eimantas 2011-05-27 08:07:23

+0

好点。它可以,但在我的情况下,这将是一个编程开销。 – yannisf 2011-05-27 08:08:27

回答

1

装饰者可以很容易地结合功能。组合功能是否有意义取决于API用户。

0

这种约束执行不是装饰模式的一部分,因为我知道它,但没有理由不能完成。这是API简单性和安全性(来自程序员错误)之间的折衷。

1

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

+0

非常好的分析,点和链接! – yannisf 2011-06-03 08:53:20