裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的乙個替代方案。
裝飾模式通過建立乙個包裝物件,也就是裝飾,來包裹真實的物件。
裝飾模式以對客戶端透明的方式動態地給乙個物件附加上更多的責任。換言之,客戶端並不會覺得物件在裝飾前和裝飾後有什麼不同。
裝飾模式可以在不創造更多子類的情況下,將物件的功能加以擴充套件。
裝飾模式把客戶端的呼叫委派到被裝飾類。裝飾模式的關鍵在於這種擴充套件是完全透明的。
抽象構件角色(component):給出乙個抽象介面,以規範準備接收附加責任的物件。
具體構件角色(concrete component):定義將要接收附加責任的類。
裝飾角色(decorator):持有乙個構件(component)物件的引用,並定義乙個與抽象構件介面一致的介面。
具體裝飾角色(concrete decorator):負責給構件物件「貼上」附加的責任。
在io中,具體構件角色是節點流,裝飾角色是過濾流。
filterinputstream和filteroutputstream是裝飾角色,而其他派生自它們的類則是具體裝飾角色。
裝飾物件和真實物件有相同的介面。這樣客戶端物件就可以以和真實物件相同的方式和裝飾物件互動。
裝飾物件包含乙個真實物件的引用(reference)。
裝飾物件接收所有來自客戶端的請求,它把這些請求**給真實的物件。
裝飾物件可以在**這些請求之前或之後附加一些功能。
這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。
publicinte***ce
component
這是抽象構件角色,是乙個介面。具體構件角色實現這個介面:
publicclass concretecomponent implements
component
}
裝飾角色:
publicclass decorator implements
component
@override
public
void
dosomething()
}
其中包含了構件角色的引用,方法呼叫中利用構件角色的方法。
具體裝飾角色(兩個):
publicclass concretedecorator1 extends
decorator
@override
public
void
dosomething()
private
void
doanotherthing()
}
publicclass concretedecorator2 extends
decorator
@override
public
void
dosomething()
private
void
doanotherthing()
}
使用測試:
publicclass
client
}
輸出:功能a
功能b-----------
功能a功能b
功能c
《head first設計模式》讀書筆記03 裝飾物件:
Java IO 裝飾者模式
裝飾模式 decorator 裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的乙個替代方案。裝飾模式通過建立乙個包裝物件,也就是裝飾,來包裹真實的物件。裝飾模式以對客戶端透明的方式動態地給乙個物件附加上更多的責任。換言之,客戶端並不會覺得物件在裝飾前和裝飾後有什麼不同。裝飾模式可以在不創...
java I O之裝飾者模式
裝飾者模式意圖 動態的給乙個物件新增額外的職責。decorator比生產子類靈活。多用組合,少用繼承。利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件 類應設計的對擴充套件開放,對修改關...
設計模式2 裝飾者模式(java IO)
設計類 開放 關閉原則 要對擴充套件開放,對修改關閉。多用組合,少用繼承。高內聚低耦合 具體原因 當我們設計的類不能滿足我們的需求的時候,我們可能設計乙個類去繼承它,但是這樣就會使物件之間高度的耦合。此時,我們就可以考慮使用裝飾者模式 把物件嵌入我們要擴充套件功能的類中,呼叫他的方法,然後跟我們定義...