我正在尋找裝飾模式的替代方案,以使其更具動態性。作爲一個簡單的例子,假設我們有這樣的代碼:面向對象編程:實時添加功能
interface Resource {
public String getName();
}
interface Wrapper extends Resource {
public Resource getSource();
}
interface Readable extends Resource {
public InputStream getInputStream();
}
interface Listable extends Resource {
public List<Resource> getChildren();
}
class File implements Readable {
...
}
class Zip implements Listable, Wrapper {
public Zip(Readable source) { ... }
}
正如你可以看到,郵編不直接實現它是從做讀書讀,但是資源。假設我們構造一個ZIP:
Zip zip = new Zip(new File());
我不想(也不能)堆棧的所有接口相互延伸(如可列延伸可讀的),我也可以構建所有的對象全部實行功能,因爲不是所有的功能都相互關聯,你希望能夠通過包裝它們來「裝飾」對象。
我確定這是一個常見問題,但有沒有解決它的模式?使用「包裝器」界面,您當然可以探測資源鏈來檢查功能,但我不確定這是否是一種理智的方法。
UPDATE
的問題是上面不那麼你不能建立的接口一個不錯的層次中的所有功能都與作爲說明。例如,假設你有這樣的任意新功能:如果您運行
interface Rateable extends Resource {
public int getRating();
}
class DatabaseRateable implements Rateable, Wrapper {
public DatabaseRateable(Resource resource) { ... }
}
:
Resource resource = new DatabaseRateable(new Zip(new File));
產生的資源已經「丟失」的所有功能(可讀,可列,...)加入該。 讓Rateable擴展爲Listable將是荒謬的。
再次我可以遞歸地檢查resource.getSource()並找出所有的功能。在即時回覆中沒有明確的解決方案,所以遞歸檢查畢竟是一個很好的選擇?
爲了什麼目的,你裝飾的對象? – flup 2013-03-27 08:42:44
爲什麼'Zip'也不能執行'Readable'? – 2013-03-27 08:42:54
你可以提供一個具體的例子,這是一個問題嗎? – Dai 2013-03-27 08:44:20