你好,我是小黃,這個題目我來回答下。
我講個故事你聽,我用的第一個手機是諾基亞,直板的,對,就是這樣的:
那時候很流行彩鈴,我很羨慕同學的彩鈴,各種各樣的,很好聽。也很羨慕他們可以用手機聽音樂。而我的手機,只能打電話。哈哈這個手機陪伴了我好幾年。
ok,故事講完了,很可惜那時候我還沒有學設計模式,更不知道有個裝飾模式,不然我可以自己裝飾下。來來來,我們說回正題。
裝飾模式 (Decorator Pattern)是23種設計模式之一,
它在不改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是透過建立一個包裝物件,也就是裝飾來包裹真實的物件。
或者說,裝飾模式就是使用被裝飾類的一個子類的例項,在客戶端將這個子類的例項交給裝飾類, 其實是繼承的替代方案。
在裝飾模式中的各個角色有:
1, 抽象構件(Component)角色:給出一個抽象介面,以規範準備接收附加責任的物件。
2, 具體構件(Concrete Component)角色:定義一個將要接收附加責任的類。
3, 裝飾(Decorator)角色:持有一個構件(Component)物件的例項,並實現一個與抽象構件介面一致的介面。
4, 具體裝飾(Concrete Decorator)角色:負責給構件物件新增上附加的責任。
我們一起來裝飾下我的諾基亞手機吧,來看看程式碼
我的諾基亞:
來個裝飾器:
裝飾點彩鈴:
裝飾點音樂:
最後來點測試:
到這裡了,我們就很容易發現裝飾模式的優缺點:
優點:使用裝飾模式,可以提供比繼承更靈活的擴充套件物件的功能,它可以動態的新增物件的功能,並且可以隨意的組合這些功能。
缺點:正因為可以隨意組合,所以就可能出現一些不合理的邏輯
其實裝飾器模式我們也有意無意中使用過,比如在Java IO類中,FileReader,BufferedReader等。以下就是:
InputStream is = System.in; // 位元組流
InputStreamReader isr = new InputStreamReader(is); // 裝飾成字元流
BufferedReader br = new BufferedReader(isr); // 裝飾成字串
另外我們經常使用的ArrayList的底層實現機制,也是利用了裝飾器模式。
以上請參考。
你好,我是小黃,這個題目我來回答下。
我講個故事你聽,我用的第一個手機是諾基亞,直板的,對,就是這樣的:
那時候很流行彩鈴,我很羨慕同學的彩鈴,各種各樣的,很好聽。也很羨慕他們可以用手機聽音樂。而我的手機,只能打電話。哈哈這個手機陪伴了我好幾年。
ok,故事講完了,很可惜那時候我還沒有學設計模式,更不知道有個裝飾模式,不然我可以自己裝飾下。來來來,我們說回正題。
裝飾模式 (Decorator Pattern)是23種設計模式之一,
它在不改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是透過建立一個包裝物件,也就是裝飾來包裹真實的物件。
或者說,裝飾模式就是使用被裝飾類的一個子類的例項,在客戶端將這個子類的例項交給裝飾類, 其實是繼承的替代方案。
在裝飾模式中的各個角色有:
1, 抽象構件(Component)角色:給出一個抽象介面,以規範準備接收附加責任的物件。
2, 具體構件(Concrete Component)角色:定義一個將要接收附加責任的類。
3, 裝飾(Decorator)角色:持有一個構件(Component)物件的例項,並實現一個與抽象構件介面一致的介面。
4, 具體裝飾(Concrete Decorator)角色:負責給構件物件新增上附加的責任。
我們一起來裝飾下我的諾基亞手機吧,來看看程式碼
我的諾基亞:
來個裝飾器:
裝飾點彩鈴:
裝飾點音樂:
最後來點測試:
到這裡了,我們就很容易發現裝飾模式的優缺點:
優點:使用裝飾模式,可以提供比繼承更靈活的擴充套件物件的功能,它可以動態的新增物件的功能,並且可以隨意的組合這些功能。
缺點:正因為可以隨意組合,所以就可能出現一些不合理的邏輯
其實裝飾器模式我們也有意無意中使用過,比如在Java IO類中,FileReader,BufferedReader等。以下就是:
InputStream is = System.in; // 位元組流
InputStreamReader isr = new InputStreamReader(is); // 裝飾成字元流
BufferedReader br = new BufferedReader(isr); // 裝飾成字串
另外我們經常使用的ArrayList的底層實現機制,也是利用了裝飾器模式。
以上請參考。