1. 裝飾者模式
裝飾者模式(Decorator Pattern)是結(jié)構(gòu)性設(shè)計(jì)模式,其目的是動(dòng)態(tài)地增強(qiáng)類的功能,卻沒有采用繼承該類的方式。裝飾者模式通過增加裝飾者類的做法娩脾,擴(kuò)大了類的結(jié)構(gòu)。
裝飾者模式的角色一共有三種打毛。
Component(抽象組件): 裝飾者和被裝飾對(duì)象實(shí)現(xiàn)的共同接口柿赊。
ConcreteComponent(具體組件):是被裝飾的對(duì)象。
Decorator(裝飾類): 負(fù)責(zé)裝飾具體組件幻枉,即為被裝飾的對(duì)象增強(qiáng)功能碰声。本模式的核心。
如果具體的組件有多個(gè)熬甫,同時(shí)又要增加不同的功能胰挑,即需要多個(gè)裝飾者的時(shí)候,可以把裝飾類拆分成 抽象裝飾者和具體裝飾者椿肩。
2. 裝飾者模式舉例
下面我們舉一個(gè)商店賣商品的例子瞻颂,不使用繼承的手段,給商店增強(qiáng)“叫賣”的功能郑象。
序號(hào) | 類名 | 角色 | 說明 |
---|---|---|---|
1 | Store | Component | 抽象組件贡这,商店 |
2 | FoodStore | ConcreteComponent | 具體組件類,食品商店 |
3 | StoreDecorator | Decorator | 裝飾類厂榛,給商店增強(qiáng)功能 |
4 | DecoratorMain | 客戶端 | 演示調(diào)用 |
1. Store類
// 抽象組件盖矫,商店
public interface Store {
// 售賣
void sell();
}
2. FoodStore類
// 具體組件類,食品商店
public class FoodStore implements Store{
@Override
public void sell() {
System.out.println("賣蛋糕咯");
}
}
3. StoreDecorator
//具體裝飾者击奶,擴(kuò)展食品商店的功能
public class StoreDecorator implements Store{
private Store store;
//裝飾者類應(yīng)該包含一個(gè)以被裝飾者對(duì)象為參數(shù)的構(gòu)造函數(shù)辈双。
// 注意對(duì)比代理模式中的代理類,構(gòu)造器是不同的柜砾。
public StoreDecorator(Store store) {
this.store = store;
}
// 給Store來點(diǎn)功能擴(kuò)展湃望,加上叫賣
public void sell() {
System.out.println("瞧一瞧,你不吃虧痰驱;看一看喜爷,你不上當(dāng)。");
store.sell();
System.out.println("歡迎下次再來");
}
}
4. DecoratorMain
// 客戶端萄唇,演示調(diào)用
public class DecoratorMain {
public static void main(String[] args) {
Store store = new FoodStore();
StoreDecorator decorator = new StoreDecorator(store);
decorator.sell();
}
}
3. 裝飾器模式總結(jié)
優(yōu)點(diǎn):
可以動(dòng)態(tài)擴(kuò)展一個(gè)對(duì)象的功能檩帐,比繼承的方式更為靈活;可以用多個(gè)裝飾者裝飾同一個(gè)對(duì)象另萤。
缺點(diǎn):
裝飾類多了湃密,對(duì)象都很相似,容易看花眼四敞。
(完)