設計模式 裝飾器模式

2022-02-14 07:50:27 字數 3505 閱讀 9463

裝飾器模式,也稱為包裝器模式,指在不改變原有物件的基礎上,動態給乙個物件新增乙個額外的職責。

使用場景:

星巴克裡面賣多種飲料,拿鐵,咖啡,每一種飲料都有自己的**。

為解決需求,設計乙個飲料抽象類:

public abstract class beverage 

string getname()

beverage(string name)

//**

public int cost()

}

具體飲料:拿鐵和咖啡繼承飲料抽象

public class coffee extends beverage

@override

public int cost()

}public class latte extends beverage

@override

public int cost()

}

測試:

現在需求變化了,現在星巴克不僅有拿鐵,咖啡,可能在拿鐵和咖啡中加入巧克力,糖,堅果,花生等調料,並且每份調料分別計算**。

那我們可以建立出巧克力拿鐵糖拿鐵堅果拿鐵花生拿鐵巧克力糖拿鐵巧克力花生拿鐵等等類,會造成類**的情況,996程式設計師也寫不完,007也難,並且每加一種調料,工作量也是成倍增加。

所以我們改進寫法:

把每乙份調料作為成員變數放入飲料中。修改飲料類:

public abstract class beverage 

string getname()

if(this.sugar)

if(this.nut)

if(this.peanut)

return name;

}beverage(string name)

//**

public int cost()

if(this.sugar)

if(this.nut)

if(this.peanut)

return cost;

}public void setchocolate(boolean chocolate)

public void setsugar(boolean sugar)

public void setnut(boolean nut)

public void setpeanut(boolean peanut)

}

以咖啡類為例,修改cost方法:

public class coffee extends beverage 

@override

public int cost()

}

測試:

需求我們完美實現了,飲料類中加多份調料,並計算出**。

這時候,救世主「裝飾器模式」誕生了!

重新修改飲料類,不再需要各種調料判斷:

public abstract class beverage 

string getname()

beverage(string name)

//**

public abstract int cost();

}

並抽象出調料類:

//調料

public abstract class seasoning extends beverage

}

寫兩個調料的實現類:巧克力和糖(花生類和堅果類不寫了)

public class chocolate extends seasoning

@override

public int cost()

@override

string getname()

}public class sugar extends seasoning

@override

public int cost()

@override

string getname()

}

測試:

測試結果:

這裡,我們實現了上述需求。以後無論增加什麼調料或者飲料,我們都只需要繼承seasoning或者beverage,調料如何加,加幾份,我們也能實現,並且無需修改原始碼。上述就是裝飾器模式的具體實現

裝飾器模式可以靈活擴充套件,但所有類都來自同乙個祖宗beverage。

uml類圖:

//抽象元件

public abstract class component

//裝飾器抽象

public abstract class decorator extends component

public void operation()

}//具體元件

public class concretecomponent extends component

}//具體裝飾器

public class concretedecorator extends decorator

public void operation()

}

測試:

public static void main(string args)
jdk中的io相關的流所用的就是最明顯的裝飾器模式。inputstream就是我們上述的飲料,而filterinputstream就是我們上述的調料。

設計模式 裝飾器模式

裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。public inte ce playe...

設計模式 裝飾器模式

裝飾者模式的應用場景 裝飾者模式 decorator pattern 是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案 擴充套件原有物件的功能 屬於結構型模式。裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋 給蛋糕加上一些水果 給房子裝修等,為物件擴充套件一些額外...

設計模式 裝飾器模式

定義 裝飾模式可以動態的給乙個物件增加一些額外的功能 增強功能 相比於繼承,裝飾模式能對不支援繼承的類進行增強 並且比繼承更靈活,不需要生成大量的子類。角色 實現 public abstract class house public abstract void sleep public class ...