設計模式 裝飾者模式

2021-10-18 04:48:44 字數 2238 閱讀 3373

咖啡種類/單品咖啡:espresso(義大利濃咖啡)、shortblack、longblack(美式

咖啡)、decaf(無因咖啡)

調料:milk、soy(豆漿)、chocolate

要求在擴充套件新的咖啡種類時,具有良好的擴充套件性、改動方便、維護方便

使用oo的來計算不同種類咖啡的費用: 客戶可以點單品咖啡,也可以單品咖啡+調料組合。

注意:咖啡可以單點,也可以加任意數量的調料,後期還可能會新增其他的咖啡中了和飲料的種類!

常規思路:

方案1-解決星巴克咖啡訂單問題分析

drink 是乙個抽象類,表示飲料

des就是對咖啡的描述, 比如咖啡的名字

cost() 方法就是計算費用,drink 類中做成乙個抽象方法.

decaf 就是單品咖啡, 繼承drink, 並實現cost

espress && milk 就是單品咖啡+調料, 這個組合很多

問題:這樣設計,會有很多類,當我們增加乙個單品咖啡,或者乙個新的調料,

類的數量就會倍增,就會出現類**

方案2-的問題分析

方案2可以控制類的數量,不至於造成很多的類

在增加或者刪除調料種類時,**的維護量很大

考慮到使用者可以新增多份 調料時,可以將hasmilk 返回乙個對應int

考慮使用 裝飾者 模式

方案3運用建造者模式:

裝飾者模式定義

裝飾者模式:動態的將新功能附加到物件上。在物件功能擴充套件方面,它比繼承更

有彈性,裝飾者模式也體現了開閉原則(ocp)

這裡提到的動態的將新功能附加到物件和ocp原則,在後面的應用例項上會以**的形式體現,請同學們注意體會。

**實現:

抽象drink

package com.atguigu.decorator;

public abstract class drink

public void setdes(string des)

public float getprice()

public void setprice(float price)

//計算費用的抽象方法

//子類來實現

public abstract float cost();

}

coffee的緩衝層

package com.atguigu.decorator;

public class coffee extends drink

}

無因咖啡

package com.atguigu.decorator;

public class decaf extends coffee

}

longblack咖啡

package com.atguigu.decorator;

public class longblack extends coffee

}

牛奶調料

package com.atguigu.decorator;

public class milk extends decorator

}

巧克力調料

package com.atguigu.decorator;

//具體的decorator, 這裡就是調味品

public class chocolate extends decorator

}

客戶端呼叫:

package com.atguigu.decorator;

public class coffeebar

}

圖示:

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...

設計模式 裝飾者模式

沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...

設計模式 裝飾者模式

好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...