2011-05-27 279 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