一、簡介
裝飾者模式要求有乙個被裝飾物件及多個裝飾者,每個裝飾者與被裝飾者實現同乙個介面或有同乙個超類,被裝飾者持有乙個裝飾者物件,所有實現由持有物件完成,裝飾者則在方法執行過程中增強方法實現(如:在方法執行前進行許可權驗證,在返回結果前進行加密處理等)。
二、**示例
要求:
商家活動要求商品具有多種打折方式在不同節日使用:
1、滿30元減5元,滿50元減10元,滿100元減30元
2、滿30元打9.5折,滿50元打9折,滿100元打8折
3、…..更多活動待擴充套件
商品介面:
public
inte***ce igoods
普通商品類:
public
class
nomalgoods
implements
igoods
@override
public string getdescription()
@override
public
double
getprice()
}
打折商品類:
public
class
discountgoods
implements
igoods
@override
//獲取商品**,根據活動要求對**進行相應折扣處理
public
double
getprice() else
if(price<50)else
return price;
}@override
//獲取商品描述並新增折扣商品標誌
public string getdescription()
}
此處裝飾者獲得**及描述都是通過普通商品獲得,之後通過裝飾者本身進行一定的處理完成一層包裝(通常用來動態的新增類的職責功能)。
滿減商品類
public
class
decreasegoods
implements
igoods
@override
//獲取商品描述並新增滿減商品標誌
public string getdescription()
@override
//獲取商品**,根據活動要求對**進行相應滿減處理
public
double
getprice() else
if(price<50)else
return price;
}}
場景模擬:
public
class decoratortest else
if(type==2)else
//列印基本資訊
system.out.println("--------------------------------");
system.out.println(goods.getdescription()
+"---price:"+(int)goods.getprice());}}
//獲取隨機**
static
int getrandprice()
//獲取隨機商品名
static
char getdescription()
//初始化倉庫
static listinitwarehouse()
return warehouse;
}}
結果列印:
--------------------------------
g---折扣商品---price:32
--------------------------------
l---滿減商品---price:20
--------------------------------
m---滿減商品---折扣商品---price:30
--------------------------------
n---滿減商品---折扣商品---price:23
--------------------------------
g---折扣商品---price:68
--------------------------------
f---滿減商品---折扣商品---price:24
--------------------------------
y---折扣商品---price:27
總結:
這個例子存在著許多瑕疵,**中充斥著許多的if…else…,比如在每種活動商品類中處理**時僅在**的處理方式上有所不同,因此可以通過建立乙個**方案工廠來生成不同的處理方案,另外在場景模擬中,如果多出其他的打折方式需要新增更多的if…else,因此可以建立乙個商品工廠通過傳入不同引數,建立出不同的折扣商品。
Java設計模式 裝飾者模式
動態的將責任附加到物件上,想要擴充套件功能,裝飾者提供有別於繼承的另一種選擇 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。例 package com.cn.gaoyan 公共抽象介面 public abstract c...
Java設計模式 裝飾者模式
愉快的工作又開始了。leader安排了乙個新的任務,給乙個酸奶店的點單軟體增加新的功能。這個程式的原來所有的酸奶都繼承於乳酪類 cheese public abstract class cheese public abstract intprice 所有具體的酸奶繼承乳酪類並重寫 price方法,以...
Java設計模式 裝飾者模式
定義 裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。我們拿買蛋糕做乙個例子吧!場景 我們去甜品店買蛋糕,裡面有各種口味的蛋糕。當你想買乙個適合你口味的蛋糕,而店員卻告訴你想要蛋糕沒有。那怎麼辦呢?別灰心,店員會...