HeadFirst 設計模式筆記(三)—— decorator
阿新 • • 發佈:2019-01-11
裝飾者模式:使用物件組合的方式在執行時給物件賦予新的功能(裝飾),而不是濫用繼承。
舉個例子就清晰了:java.io這個包中就應用了這一模式FilterInputStream是一個裝飾者類,它和它的子類可以對InputStream的其他子類進行裝飾。
class java.io.InputStream
這就是裝飾者模式的典型用法,通過用一個新的物件包裝原有物件從而獲得新的功能。通過這種方式我們不必更改FileInputStream這個類就可以獲得新的功能了。
更重要的一點是,由於裝飾者和被裝飾者都繼承自同一個超類,所以被裝飾過的物件並不會因此改變型別而影響使用。換句話說,只要我們的方法以InputStream為引數,假設以前我們的實參為FileInputStream,而現在我們使用裝飾過以後的FileInputStream(例如BufferedInputStream)做實參,使得我們的方法擁有了新的功能(因為BufferedInpustStream覆蓋了FileInputStream中的一些方法,比如read),而不需修改程式碼。
我們把BufferedInpustStream抽取成一個裝飾類以後可以用它來裝飾多個InputStream家族中的類,這樣會更靈活。相反,如果當我們希望FileInputStream有Buffer功能時就建立一個新類叫BufferedFileInputStream的話… 這種思路將產生很多類,很多重複程式碼,而且很不靈活。
裝飾者模式:動態地將責任附加到物件上,想要擴充套件功能,裝飾者是有別於繼承的另一種選擇。
舉個例子就清晰了:java.io這個包中就應用了這一模式FilterInputStream是一個裝飾者類,它和它的子類可以對InputStream的其他子類進行裝飾。
class java.io.InputStream
- class java.io.ByteArrayInputStream
- class java.io.FileInputStream
- class java.io.FilterInputStream
- class java.io.
- class java.io.DataInputStream (implements java.io.DataInput)
- class java.io.LineNumberInputStream
- class java.io.PushbackInputStream
- class java.io.
- class java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants)
- class java.io.PipedInputStream
- class java.io.SequenceInputStream
這就是裝飾者模式的典型用法,通過用一個新的物件包裝原有物件從而獲得新的功能。通過這種方式我們不必更改FileInputStream這個類就可以獲得新的功能了。
更重要的一點是,由於裝飾者和被裝飾者都繼承自同一個超類,所以被裝飾過的物件並不會因此改變型別而影響使用。換句話說,只要我們的方法以InputStream為引數,假設以前我們的實參為FileInputStream,而現在我們使用裝飾過以後的FileInputStream(例如BufferedInputStream)做實參,使得我們的方法擁有了新的功能(因為BufferedInpustStream覆蓋了FileInputStream中的一些方法,比如read),而不需修改程式碼。
我們把BufferedInpustStream抽取成一個裝飾類以後可以用它來裝飾多個InputStream家族中的類,這樣會更靈活。相反,如果當我們希望FileInputStream有Buffer功能時就建立一個新類叫BufferedFileInputStream的話… 這種思路將產生很多類,很多重複程式碼,而且很不靈活。
裝飾者模式:動態地將責任附加到物件上,想要擴充套件功能,裝飾者是有別於繼承的另一種選擇。