HeadFirst 設計模式筆記(三)—— decorator

裝飾者模式:使用對象組合的方式在運行時給對象賦予新的功能(裝飾),而不是濫用繼承。

舉個例子就清晰了:java.io這個包中就應用了這一模式FilterInputStream是一個裝飾者類,它和它的子類可以對InputStream的其他子類進行裝飾。

class java.io.InputStream
看看這行語句:new LineNumberInputStream(new BufferedInputSream(new FileInputStream(...)));

這就是裝飾者模式的典型用法,通過用一個新的對象包裝原有對象從而獲得新的功能。通過這種方式我們不必更改FileInputStream這個類就可以獲得新的功能了。

更重要的一點是,由於裝飾者和被裝飾者都繼承自同一個超類,所以被裝飾過的對象並不會因此改變類型而影響使用。換句話說,只要我們的方法以InputStream爲參數,假設以前我們的實參爲FileInputStream,而現在我們使用裝飾過以後的FileInputStream(例如BufferedInputStream)做實參,使得我們的方法擁有了新的功能(因爲BufferedInpustStream覆蓋了FileInputStream中的一些方法,比如read),而不需修改代碼。

我們把BufferedInpustStream抽取成一個裝飾類以後可以用它來裝飾多個InputStream家族中的類,這樣會更靈活。相反,如果當我們希望FileInputStream有Buffer功能時就建立一個新類叫BufferedFileInputStream的話… 這種思路將產生很多類,很多重複代碼,而且很不靈活。

裝飾者模式:動態地將責任附加到對象上,想要擴展功能,裝飾者是有別於繼承的另一種選擇。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章