設計模式之-裝飾器模式
基本概念
裝飾器模式,顧名思義起的是裝飾的作用,就是在一個類上增加功能。如果透過繼承來增加功能,在不修改程式碼的情況下,如果增加功能多的話,會使類的數量爆炸式增長,為管理帶來巨大的麻煩。裝飾器模式就比較好地解決了這一點。
介紹
以下為裝飾器模式的通用類圖:
- 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("製作一件衣服"); } }
- 步驟 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("衣服做好了"); } }
執行程式,輸出結果:
製作一件衣服 給衣服繡花 關鍵位置鏤空 衣服做好了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983799/viewspace-2722256/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式之【裝飾器模式】設計模式
- Go 設計模式之裝飾器模式Go設計模式
- java設計模式之裝飾器模式Java設計模式
- 設計模式之裝飾器模式(decorator pattern)設計模式
- 【趣味設計模式系列】之【裝飾器模式】設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- Java學設計模式之裝飾器模式Java設計模式
- 【設計模式之裝飾模式】設計模式
- 設計模式之裝飾模式設計模式
- 設計模式----裝飾器模式設計模式
- 設計模式-裝飾器模式設計模式
- [設計模式] 裝飾器模式設計模式
- 設計模式系列之「裝飾模式」設計模式
- 設計模式之裝飾者模式設計模式
- 設計模式(八)裝飾器模式設計模式
- 設計模式(六):裝飾器模式設計模式
- java設計模式--裝飾器模式Java設計模式
- 設計模式之裝飾者模式(二)設計模式
- 設計模式之裝飾者模式(一)設計模式
- PHP設計模式之裝飾者模式PHP設計模式
- Java設計模式之裝飾者模式Java設計模式
- 我學設計模式 之裝飾模式設計模式
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- Java設計模式系列-裝飾器模式Java設計模式
- Python設計模式-裝飾器模式Python設計模式
- Java 設計模式(五)《裝飾器模式》Java設計模式
- java設計模式-裝飾器模式(Decorator)Java設計模式
- Java設計模式12:裝飾器模式Java設計模式
- 設計模式——裝飾模式設計模式
- 設計模式-裝飾模式設計模式
- 設計模式-裝飾設計模式設計模式
- Golang 常見設計模式之裝飾模式Golang設計模式
- android常用設計模式之裝飾模式Android設計模式
- JAVA設計模式之 裝飾模式【Decorator Pattern】Java設計模式
- Java設計模式之裝飾模式趣談Java設計模式
- 23種設計模式(三)--裝飾器模式設計模式
- 設計模式專題(七)裝飾器模式設計模式
- 設計模式 #4 (裝飾器模式、介面卡模式)設計模式