咖啡店裡咖啡中可以加不同的配料–摩卡、牛奶、糖、奶泡;不同的飲品加上不同的配料有不同的價錢,怎樣實現呢?
可能你的第一印象會想到使用繼承,
1. 首先定義乙個咖啡基類
2. 對於加糖的,加牛奶的,加摩卡的 ,加奶泡的,分別寫乙個子類繼承
3. 對於加糖,又加奶的寫乙個類,對於對於加糖,又摩卡的寫乙個類,對於對於加糖、又奶泡的寫乙個類,對於加糖,又加奶、摩卡的寫乙個類—-
說到這裡,你會發現這裡四種配料就要寫十幾種實現類了,那如果我們的配料是二十幾種或者三十幾種呢,那麼使用繼承這種 方式肯定會使我們的子類**,那要怎樣解決你,答案就是使用裝飾者模式
我覺得裝飾者模式是在已有功能的基礎之上,動態地新增更多 功能的一種方式,這些新加的**裝飾了原有類的 核心職責或主要行為。
* @ explain:這裡coffee相當於我們的component,
* 是要裝飾的類
* * @ author:xujun on 2016/7/10 23:16
* @ email:[email protected]
*/public
abstract
class
coffee
/**
* @ explain:
* @ author:xujun on 2016/7/10 23:21
* @ email:[email protected]
*/public
abstract
class
decorator
extends
coffee
}
public
class
milkdecorator
extends
decorator
@override
public
intgetprice()
@override
public string getname()
}
其實核心**就下面一行,在原來的**加上 加牛奶的**
return mcoffee.getprice()+10
return mcoffee.getprice()+2;
return mcoffee.getprice()+15;
return mcoffee.getprice()+20;
以後你想要計算加糖,就牛奶,加奶泡的咖啡的**,只需要這樣
mcoffee = new ******coffee();
mcoffee = new sugardecorator(mcoffee);
mcoffee = new milkdecorator(mcoffee);
mcoffee = new milkfoamdecorator(mcoffee);
int price1 = mcoffee.getprice();
system.out.println("price1="+price1);
以後你想要計算加糖,就牛奶咖啡的**,只需要這樣
mcoffee = new ******coffee();
mcoffee = new sugardecorator(mcoffee);
mcoffee = new milkdecorator(mcoffee);
int price1 = mcoffee.getprice();
system.out.println("price1="+price1);
簡單的裝飾者模式
裝飾者模式主要用來擴充套件功能的,不會改變原來物件的功能,只做擴充套件 版本一 如下 public abstract class beefnoodlepublic class basebeefnoodle extends beefnoodle public int getprice public c...
裝飾者模式簡單理解
裝飾者模式簡單理解 1.定義 增強乙個類的功能,還可以讓裝飾者類之間互相裝飾 2.步驟 1 裝飾者類中需要維護乙個被裝飾者類的引用 2 讓裝飾者類有乙個共同的父類,或者父介面 eq 例項 裝飾者類與繼承的區別 繼承實現的增強類 優點 結構清晰,而且實現簡單 缺點 對於每乙個的需要增強的類都要建立具體...
裝飾者模式簡單示例 一
例項參考於 headfirst設計模式 public abstract class beverage cost必須在子類中實現 public abstract double cost public abstract class condimentdecorator extends beverage ...