天天看點

Java設計模式-裝飾者模式定義優缺點實作

最近學習到設計模式,現總結個人學習裝飾者模式内容【注重的是過程,在不改變原有對象的基礎之上,将功能動态附加到對象上】。

上一篇:Java設計模式-橋接模式

文章目錄

  • 定義
  • 優缺點
    • 優點
    • 缺點
  • 實作
    • 代碼
    • 測試

定義

裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動态地擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象。通過裝飾類,包裝原有的類,不改變原有的結構[原有類方法簽名完整]的情況下添加新的功能。

優缺點

優點

  • 不改變原有對象的情況下【動态】給一個對象擴充功能。(使用裝飾者可以在運作時決定,擴充某些功能)
  • 通過使用不同裝飾類以及這些類的排列組合,可以實作不同的效果,同時符合開閉原則。

缺點

  • 動态裝飾時,多層裝飾時會更複雜,會增加更多新的類,增加程式的複雜性。

實作

裝飾模式中的角色:

抽象構件(Component) 角色:Component是一個抽象類或接口,是要包裝的原始對象【這裡的Food(菜)類】。

具體構件(ConcreteComponent)角色:是Component的實作類,最終要裝飾的實際對象【這裡的PotatoSilk(洋芋絲)類】。

裝飾(Decorator)角色:是一個抽象類,繼承或實作了Component的接口,同時它持有一個對Component執行個體對象的引用,也可以有自己的方法【這裡的Decorator(裝飾)類】。

具體裝飾(ConcreteDecorator)角色:是Decorator的實作類,是具體的裝飾者對象,負責給ConcreteComponent附加責任【這裡的Salt(鹽)裝飾類】。

Java設計模式-裝飾者模式定義優缺點實作

代碼

裝飾者模式和被裝飾的類要實作同一個接口,或者裝飾類是被裝飾的類的子類

原接口/抽象類以及具體實作類
/* 
 * 菜  
 */
public abstract class Food {
	String type;
	Double price=0d;
	abstract Double reckonPrice();
	abstract String getType();
}
/**
 * 洋芋絲
 * @author cc百川
 */
class PotatoSilk extends Food{
	PotatoSilk(){
		type="洋芋絲";
		price = 12.5d;
	}
	@Override
	Double reckonPrice() {
		return price;
	} 
	String getType(){
		return type;
	}
}
           
裝飾類以及具體裝飾類
/**
 * 裝飾模式可以是抽象類,可以定義好行為,減少子類的重複代碼
 * ,繼承了food【用于修飾裝飾誰】,并聚合了food類
 * @author cc百川
 * 這裡裝飾類是被裝飾的類的子類
 */
public  class Decorator extends Food{
	Food food;//持有了被裝飾類的引用
	@Override
	Double reckonPrice() {
		return price + food.reckonPrice();
	}
	String getType(){
		return food.getType() + " "+type;
	}
	Decorator(Food food){
		this.food = food;
	}
}
/**
 * 鹽裝飾類,繼承了裝飾類
 * @author cc百川
 *
 */
class Salt extends Decorator{
	Salt(Food food) {
		super(food);
		type = " 鹽 ";
		price = 0.5d;
	} 	
}
/**
 * 後期按照需求擴充的雞精
 * @author cc百川
 *
 */
class ChickenEssence extends Decorator{
	ChickenEssence(Food food){
		super(food);
		type = " 雞精 ";
		price = 0.15d;
	}
}
           

測試

Java設計模式-裝飾者模式定義優缺點實作

裝飾者模式,可用于動态添加功能【注意與代理的差別】

以上僅為個人學習,如果錯誤望指出,謝謝。

繼續閱讀