設計模式之裝飾器模式


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

  

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

  

  Component,一般是接口或者抽象類,定義了最簡單的方法,裝飾器類和被裝飾類都要實現該接口。
 
  ConcreteComponent,被裝飾類,實現了Component。
 
  Decorator,裝飾器類,通過該類為ConcreteComponent動態添加額外的方法,實現了Component接口,並且該對象中持有一個Component的成員變量。
 
  ConcreteDecoratorA,ConcreteDecoratorB,具體的裝飾類,該類中的方法就是要為ConcreteComponent動態添加的方法。

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

interface Clothes {
	public void makeClothes();
}
class MakeClothes implements Clothes {

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

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

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

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

class Embroidery extends Decorator {

	public Embroidery(Clothes _clothes) {
		super(_clothes);		
	}
	public void embroidery() {
		System.out.println("給衣服綉花");
	}
	public void makeClothes() {
		super.makeClothes();
		this.embroidery();
	}
}
class Hollow extends Decorator {

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

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

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

  測試打印結果如下:

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

      可見裝飾的效果還是不錯的,不過裝飾器模式雖然好用,但是如果裝飾層數過多,還是會影響到維護的,所以說設計模式雖好,還是需要靈活使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM