設計模式之-裝飾器模式

炸雞啤酒不可負發表於2020-09-18

基本概念

裝飾器模式,顧名思義起的是裝飾的作用,就是在一個類上增加功能。如果通過繼承來增加功能,在不修改程式碼的情況下,如果增加功能多的話,會使類的數量爆炸式增長,為管理帶來巨大的麻煩。裝飾器模式就比較好地解決了這一點。

介紹

以下為裝飾器模式的通用類圖:

  • Component,一般是介面或者抽象類,定義了最簡單的方法,裝飾器類和被裝飾類都要實現該介面。
  • ConcreteComponent,被裝飾類,實現了Component。
  • Decorator,裝飾器類,通過該類為ConcreteComponent動態新增額外的方法,實現了Component介面,並且該物件中持有一個Component的成員變數。
  • ConcreteDecoratorA,ConcreteDecoratorB,具體的裝飾類,該類中的方法就是要為ConcreteComponent動態新增的方法。

實現

我們以生產一件衣服為例,生產一件衣服本身是個很簡單的過程,一塊布料裁剪好了之後做出衣服的樣子就可以了,但是這樣的衣服是賣不出去的,因為毫無美感,我們需要通過一些裝飾來使衣服變得好看。但是時代在變化,人們的審美也在變化,裝飾總是不斷在變的,所以我們就要有一個靈活機動的模式來修改裝飾。

Clothes.java

public interface Clothes {
    public void makeClothes();
}

MakeClothes.java

public class MakeClothes implements Clothes {

    @Override
    public void makeClothes() {
        System.out.println("製作一件衣服");
    }

}
  1. 步驟 3
    建立裝飾器。

OperationSubstract.java

public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

話不多說,先來個衣服的最初成品,就是毫無美感的那種,那麼如果現在要增加裝飾,可以用一個類繼承MakeClothes,然後增加里面makeClothes()方法,但是如果過幾天裝飾就變了,那麼又要改動程式碼,而且如果裝飾過多,這個類就顯得很龐雜,不好維護,這個時候裝飾器模式就來大顯身手了。

Decorator.java

public class Decorator implements Clothes {

    private Clothes clothes;
    public Decorator(Clothes _clothes) {
        this.clothes = _clothes;
    }
    @Override
    public void makeClothes() {
        clothes.makeClothes();
    }
}

這就是一個裝飾器,它有一個建構函式,引數是一個衣服類,同時它過載了makeClothes()方法,以便它的子類對其進行修改。下面是兩個子類,分別對衣服進行了繡花和鏤空

Embroidery.java

public class Embroidery extends Decorator {

    public Embroidery(Clothes _clothes) {
        super(_clothes);
    }
    public void embroidery() {
        System.out.println("給衣服繡花");
    }
    @Override
    public void makeClothes() {
        super.makeClothes();
        this.embroidery();
    }
}

Hollow.java

public class Hollow extends Decorator {

    public Hollow(Clothes _clothes) {
        super(_clothes);
    }
    public void hollow() {
        System.out.println("關鍵位置鏤空");
    }
    @Override
    public void makeClothes() {
        super.makeClothes();
        this.hollow();
    }
}

這兩個子類的構造器都傳入一個衣服模型,而且兩個子類分別有各自的方法——繡花和鏤空,但是他們均重寫了makeClothes()方法,在製作衣服的過程中加入了繡花和鏤空的操作,這樣一來,我們只需要增刪改這幾個裝飾器的子類,就可以完成各種不同的裝飾,簡潔明瞭,一目瞭然。下面測試一下:

DecoratorDemo.java

public class DecoratorDemo {

    public static void main(String[] args) {
        Clothes clothes = new MakeClothes();
        clothes = new Embroidery(clothes);
        clothes = new Hollow(clothes);
        clothes.makeClothes();
        System.out.println("衣服做好了");
    }
}

執行程式,輸出結果:

製作一件衣服
給衣服繡花
關鍵位置鏤空
衣服做好了

參考

結語

歡迎關注微信公眾號『碼仔zonE』,專注於分享Java、雲端計算相關內容,包括SpringBoot、SpringCloud、微服務、Docker、Kubernetes、Python等領域相關技術乾貨,期待與您相遇!

相關文章