
裝飾器(Decorator)
概念
裝飾器模式是一種結構型模式,常用於包裝已定型的類別(與配接器模式同樣又稱Wrapper),在不需要更動核心程式碼的狀況下將類別包一層殼,使其能比原有的類別方法附加了其他功能。
裝飾器模式的架構相對其他模式較為固定,透過繼承相同的介面來維持相同的物件階層,使用起來像是在杯子裡倒入各種不同的飲料。
正好最近喜歡在家調酒,今天就來嘗試調一杯馬丁尼吧!來看看下面範例。
範例
//**************
//* author: cian
//* 20231020
//**************
interface ICocktail
{
string GetIngredients();
}
/* 馬丁尼 */
class Martini : ICocktail
{
public string GetIngredients()
{
return $"Martini:";
}
}
/* 裝飾器: 雞尾酒材料 */
abstract class CocktailDecorator : ICocktail
{
private readonly ICocktail decoratedCocktail;
public CocktailDecorator(ICocktail _cocktail)
{
decoratedCocktail = _cocktail;
}
public virtual string GetIngredients()
{
return decoratedCocktail.GetIngredients();
}
}
/* 琴酒 */
class AddGin : CocktailDecorator
{
public AddGin(ICocktail _cocktail) : base(_cocktail) {}
public override string GetIngredients()
{
return base.GetIngredients() + " Gin";
}
}
/* 乾香(苦)艾酒 */
class AddDryVermouth : CocktailDecorator
{
public AddDryVermouth(ICocktail _cocktail) : base(_cocktail) {}
public override string GetIngredients()
{
return base.GetIngredients() + " Dry Vermouth";
}
}
class MainApp
{
static void Main(string[] args)
{
//最近喜歡在家調酒,就來試試看吧。
//來做一杯馬丁尼
ICocktail martini = new Martini("Martini");
martini = new AddGin(martini);
martini = new AddDryVermouth(martini);
ConsoleWriteLine(martini.GetIngredients());
//OUTPUT: Martini: Gin Dry Vermouth
}
}
結語
以上為學習過程的紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言