java裝飾器模式--一個廚師也懂的模式,你懂了嗎?

  這篇博客我們來繼續講結構型模式,上一篇的適配器模式,如果讀者有看過的話,應該會知道結構型模式關鍵還是在於類的繼承,接口的實現。互相組合來實現我們想要的代碼結構。那裝飾器模式又是一個怎麼樣的存在呢?

  我們先從之前的概念講起來,假如有這麼一個類class1,它的方法有function1,function2。然後我們想除了想用這2個方法之外呢,還想用function3。那我們可以寫一個子類class2,用class2來繼承這個父類class1。在class2中加上function3。這樣我們就可以只需要新建一個子類class2。就可以調用這3個方法了。恩,挺好的。然而第二天,你想用function4。但是不想用function3了。想了下,沒問題,那我再新建一個子類class3。用它來繼承父類class1。加上function4。當你寫完的時候是不是覺得有點做重複工作啊,這樣我不是每天都要寫一個類嗎?裝飾器模式就可以幫你大忙了。

  爲了更好的描述裝飾器模式,我們來舉一個煲湯的例子。平時工作日沒空煮菜吃。到了週末,博主最喜歡去買筒骨回來煲骨頭湯了。

  那我們先來寫一個煲湯的接口吧。

  

public interface Ibaotang {
	
	/**
	 * 往水裏放筒骨的方法
	 * 統稱爲放材料
	 */
	public void fangcailiao();

} 

  好了,接口寫好了。我們在寫一個煲湯的類去實現接口吧。

public class baotang implements Ibaotang{

	@Override
	public void fangcailiao() {
		System.out.println("往水裏放筒骨,開始煲湯");		
	}
}

  這樣,就可以煲筒骨湯了,可是博主我還喜歡放玉米和筒骨一起,這樣煲出來的湯又甜又香。來吧,我們寫一個加玉米的類。

/**
 * 加玉米的“裝飾”
 * @author yidongming
 *
 */
public class yumi implements Ibaotang{
	private Ibaotang ibaotang;
	
	public yumi(Ibaotang ibaotang){
		this.ibaotang = ibaotang;
	}

	@Override
	public void fangcailiao() {
		System.out.println("往水裏加點玉米");
		ibaotang.fangcailiao();
		
	}
} 

  這個玉米的類也實現了煲湯的接口。但是重寫的方法裏面帶上了ibaotang的fangcailiao方法。自己也完成了加玉米的操作。我們來測試看看怎麼調用吧。

public class baotangtest {
	public static void main(String[] args) {
		Ibaotang ibt =  new baotang();
		Ibaotang ym = new yumi(ibt);
		ym.fangcailiao();
	}

}
輸出結果:
往水裏加點玉米
往水裏放筒骨,開始煲湯 

 這就完成了我們加玉米的操作了。可能看到這裏還不是很通透。那我們再加點佐料吧,湯總要點鹽吧?我們來繼續添加加鹽的類。

public class jiayan implements Ibaotang{
	private Ibaotang ibaotang;
	
	public jiayan(Ibaotang ibaotang){
		this.ibaotang = ibaotang;
	}

	@Override
	public void fangcailiao() {
		System.out.println("加點鹽,料酒。");
		ibaotang.fangcailiao();
	}
}  

  加鹽的類和加玉米的類幾乎一樣。我們直接看調用吧。

public class baotangtest {
	/*public static void main(String[] args) {
		Ibaotang ibt =  new baotang();
		Ibaotang ym = new yumi(ibt);
		ym.fangcailiao();
	}*/
	public static void main(String[] args) {
		Ibaotang ibt =  new baotang();
		Ibaotang ym = new yumi(ibt);
		Ibaotang jiayan = new jiayan(ym);
		jiayan.fangcailiao();
	}

}

  

加點鹽,料酒。
往水裏加點玉米
往水裏放筒骨,開始煲湯

可以看的到,我們調用的方法也是一樣的。這樣就完成了裝飾器模式了。你可以再多次添加不同的裝飾器的類。你還可以加一個胡蘿蔔類,淮山類,煲你想要的湯。更重要的事。你還可以調整加的順序,甚至是加的次數。靈活多變。不會修改到原來的代碼。充分體現了設計模式的開閉原則,依賴倒轉原則,合成複用原則。所以我在之前的篇章中就說到,設計模式的精髓是這幾個原則,具體的模式是圍繞這幾個內功心法創造出來的招式。當你不明白心法的時候,多練點招式,也能感受到心法的奧妙。

  最後,我們來總結下裝飾器模式的作用。

 好處:可以讓我們對之前的類進行很好的擴展。比起繼承類的方式,裝飾器模式對功能的擴展是很動態的。可以添加撤銷,因爲你還可以添加判斷條件。你還可以編寫很多各種各樣的裝飾類,以各樣的順序和次數進行裝飾。

  不好的地方:裝飾類多了,功能相似,出了問題的時候,排錯花的時間就長了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章