裝飾者模式:
動態的將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
裝飾者模式類圖:
component是我們要裝飾的元件,decorator是我們的裝飾器,在這裡繼承要裝飾的元件(使用裝飾的目的就是拓展功能而不改變原有的**;這樣,我們新增乙個裝飾者,客戶端依然可以呼叫原有的元件介面來使用我們的擴充套件了功能的物件)。
concretedecorator是我們具體的裝飾者,如何實現所謂的裝飾呢?---通過組合的方式,在構造器獲取component的例項物件並設定要裝飾的物件,然後實現繼承自基類component的方法(這裡組合了要裝飾物件的該方法,並進行新功能新增,即實現了裝飾的目的)。
裝飾者模式示例圖(摘自headfirst設計模式):
該示例是乙個關於飲料(beverage)的裝飾者模式。下面先看**:
beverage(飲料)是乙個抽象類,有getdescription()和cost()兩個方法;它就是類圖中的component,我們要進行裝飾的類;
public abstract class beverage
public abstract double cost();
}
condimentdecractor(調料)抽象類,就是我們的裝飾者抽象類;
//首先,必須讓condimentdecorator能夠取代beverage,所以將condimentdecorator擴充套件自beverage類。
public abstract class condimentdecorator extends beverage
以上就是我們的基類,下面開始寫實現類:
//濃縮咖啡espresso,擴充套件自beverage飲料
public class espresso extends beverage
//直接計算espresso的價錢
public double cost()
}
public class houseblend extends beverage
public double cost()
}
上面兩例就是我們具體的元件(concretecomponent),下面我們來實現具體的裝飾者(condimentdecorator):
//摩卡裝飾者類,擴充套件調料裝飾者類(此類也擴充套件自beverage)
public class mocha extends condimentdecorator
//這裡敘述不只是描述飲料(如"espresso"),而是完整地連調料都描述出來(如"espresso, mocha")。
//利用委託的做法,得到乙個敘述,然後在其後加上附加的敘述(如"mocha")。
public string getdescription()
//要計算mocha飲料的價錢,首先把呼叫委託給被裝飾物件,以計算價錢,然後再加上mocha的價錢,得到最後結果。
public double cost()
}
終於完成了,下面來進行最後的模擬測試:
public class startbuzzcoffee
參考書籍
:《head first 設計模式》《大話設計模式》
裝飾者模式 結構型
裝飾器模式 動態地給乙個物件新增一些額外的職責或者行為。就增加功能來說,decorator模式相比生成子類更為靈活。裝飾器模式提供了改變子類的靈活方案。裝飾器模式在不必改變原類檔案和使用繼承的情況下,動態的擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。在裝飾模式中的角...
裝飾者模式(Decorator) 結構型
1 基礎知識 定義 在不改變原有物件的基礎上,將功能附加到物件上即動態地給乙個物件新增一些額外的職責。特徵 提供了比繼承更有彈性的替代方案。本質 動態組合。使用場景 擴充套件乙個類的功能或給乙個類新增附加的職責 動態給乙個物件新增功能,這些功能還可以動態撤銷。優點 比繼承更加靈活,繼承是靜態的在設計...
設計模式 裝飾者模式 結構型
裝飾者模式 動態的給一些物件新增一些職能,就增加功能來說,裝飾者比生成子類更靈活。模型圖 public abstract class componentpublic class concretecomponet extends component public abstract class deco...