設計模式之簡單理解裝飾器模式與運用
阿新 • • 發佈:2019-11-03
1.什麼是裝飾器模式
裝飾器模式(Decorator Pattern)允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
2、裝飾器模式的重要組成部分
①裝飾器模式特點:
(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動。
(2) 裝飾物件包含一個真實物件的引用(reference)
(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求轉發給真實的物件。
(4) 裝飾物件可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在面向物件的設計中,通常是通過繼承來實現對給定類的功能擴充套件。
②裝飾器模式由元件和裝飾者組成:
- 抽象元件(Component):需要裝飾的抽象物件。
- 具體元件(ConcreteComponent):是我們需要裝飾的物件。
- 抽象裝飾類(Decorator):內含指向抽象元件的引用及裝飾者共有的方法。
- 具體裝飾類(ConcreteDecorator):被裝飾的物件。
3.裝飾器模式的具體實現
生活中的裝飾器小例子:
公路上的汽車川流不息,我們的生活總是繁忙不停。終於有了一個假期.我們開著汽車出去玩,但是正如世界上沒有同樣自己的一樣,總想找點不一樣的感覺。於是我們買了油漆,照著圖案給車來個帥氣的賽車紋理,終於與眾不同了,我們開車去玩吧!
package jiagouxiancheng.month_11.day1103.zhuangshiqi; interface Car { void run(); } class BMWCar implements Car { @Override public void run() { System.out.println("寶馬開動..."); } } class BenzCar implements Car { @Override public void run() { System.out.println("賓士開動..."); } } /** * 賽車油漆塗料 */ class PaintDecorator implements Car { protected Car car; public PaintDecorator(Car car) { this.car = car; } @Override public void run() { car.run(); } } class CoolPanintDecorator extends PaintDecorator { public CoolPanintDecorator(Car car) { super(car); } @Override public void run() { cooolPanint(); car.run(); } private void cooolPanint() { System.out.print("刷上帥氣的賽車圖案的油漆->"); } } /** * 給車來個酷酷的造型 */ public class DriveCar { public static void main(String[] args) { System.out.println("公路上的車川流不息..."); Car bmwCar = new BMWCar(); Car benzCar = new BenzCar(); bmwCar.run(); benzCar.run(); System.out.println("這次我們先給車來個酷酷的造型!"); Car car = new CoolPanintDecorator(benzCar); car.run(); } }
輸出結果:
公路上的車川流不息...
寶馬開動...
賓士開動...
這次我們先給車來個酷酷的造型!
刷上帥氣的賽車圖案的油漆->賓士開動...
4.總結
①優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴充套件一個實現類的功能。
②缺點:多層裝飾比較複雜。
③使用場景:1、擴充套件一個類的功能。 2、動態增加功能,動態撤銷