1. 程式人生 > >設計模式之簡單理解裝飾器模式與運用

設計模式之簡單理解裝飾器模式與運用

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、動態增加功能,動態撤銷