引言
??繼續(xù)上一節(jié)的外觀模式,我們?cè)趤碚f裝飾模式冗尤。
示例地址
??Demo
類圖
定義
??動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)纱烘。就增加功能來說雳灵,裝飾模式相比生成子類更為靈活类嗤。
使用場(chǎng)景
??需要透明且動(dòng)態(tài)地?cái)U(kuò)展的功能時(shí)糊肠。
裝飾模式角色介紹
??1. Component:抽象組件,被裝飾的原始對(duì)象土浸。
??2. ConcreteComponent: 組件具體實(shí)現(xiàn)類罪针。裝飾的具體對(duì)象。
??3. Decorator:抽象的裝飾者黄伊,用來裝飾組件的。一般是為抽象類派殷。如果裝飾單一还最,該類可直接作為具體的裝飾者。
??4. ConcreteDecoratorA:裝飾者具體實(shí)現(xiàn)類毡惜。
裝飾模式示例
??最近幫別人買了手機(jī)拓轻。然后他自己貼了一個(gè)鋼化膜,買了一個(gè)手機(jī)外殼经伙,加上一個(gè)吊墜扶叉,格外的珍惜。不過比之前漂亮了不少帕膜。突然發(fā)現(xiàn)這是典型的裝飾模式啊枣氧。
1. 定義手機(jī)接口
/**
* 手機(jī)
*
* @author 512573717@qq.com
* @created 2018/7/25 下午5:30.
*/
public interface IPhone {
//裝飾
void decorate();
}
2. 實(shí)現(xiàn)手機(jī)接口(被裝飾的對(duì)象 華為手機(jī))
/**
* 華為手機(jī)
*
* @author 512573717@qq.com
* @created 2018/7/26 下午1:59.
*/
public class HuaWeiPhone implements IPhone{
@Override
public void decorate() {
System.out.println("華為手機(jī)");
}
}
3. 裝飾者(外殼)
/**
* 外殼
*
* @author 512573717@qq.com
* @created 2018/7/26 下午2:01.
*/
public abstract class Shell implements IPhone {
private IPhone mHuaWeiPhone;
public Shell(IPhone huaWeiPhone) {
mHuaWeiPhone = huaWeiPhone;
}
@Override
public void decorate() {
mHuaWeiPhone.decorate();
}
}
4. 粉紅色的外殼加掛墜
/**
* 紅色的外殼
*
* @author 512573717@qq.com
* @created 2018/7/26 下午2:05.
*/
public class RedShell extends Shell {
public RedShell(IPhone huaWeiPhone) {
super(huaWeiPhone);
}
public void shell() {
System.out.println("粉紅色外殼");
}
public void pendant() {
System.out.println("小豬佩奇掛件");
}
@Override
public void decorate() {
super.decorate();
shell();
pendant();
}
}
5. 裝飾者(貼膜)
/**
* 手機(jī)貼膜
*
* @author 512573717@qq.com
* @created 2018/7/26 下午2:17.
*/
public abstract class Membrane implements IPhone {
private IPhone mHuaWeiPhone;
public Membrane(IPhone huaWeiPhone) {
mHuaWeiPhone = huaWeiPhone;
}
@Override
public void decorate() {
mHuaWeiPhone.decorate();
}
}
6. 貼鋼化膜
/**
* 鋼化膜
*
* @author 512573717@qq.com
* @created 2018/7/26 下午2:22.
*/
public class TemperingMembrane extends Membrane {
public TemperingMembrane(IPhone huaWeiPhone) {
super(huaWeiPhone);
}
public void pasting() {
System.out.println("藍(lán)光鋼化膜");
}
@Override
public void decorate() {
super.decorate();
pasting();
}
}
7. Client
IPhone phone = new HuaWeiPhone();
System.out.println("裝飾外殼");
RedShell redShell = new RedShell(phone);
redShell.decorate();
System.out.println("手機(jī)貼膜");
TemperingMembrane temperingMembrane = new TemperingMembrane(redShell);
temperingMembrane.decorate();
總結(jié)
??裝飾模式降低系統(tǒng)的耦合度,可以動(dòng)態(tài)的增加或刪除對(duì)象的職責(zé)垮刹,并使得需要裝飾的具體構(gòu)建類和具體裝飾類可以獨(dú)立變化达吞,以便增加新的具體構(gòu)建類和具體裝飾類。
??1. 優(yōu)點(diǎn):
????擴(kuò)展對(duì)象功能荒典,比繼承靈活酪劫,不會(huì)導(dǎo)致類個(gè)數(shù)急劇增加
????可以對(duì)一個(gè)對(duì)象進(jìn)行多次裝飾吞鸭,創(chuàng)造出不同行為的組合,得到功能更加強(qiáng)大的對(duì)象
????具體構(gòu)建類和具體裝飾類可以獨(dú)立變化覆糟,用戶可以根據(jù)需要自己增加新的具體構(gòu)件子類和具體裝飾子類
??2. 缺點(diǎn):
????產(chǎn)生很多小對(duì)象刻剥。大量小對(duì)象占據(jù)內(nèi)存,一定程度上影響性能
????裝飾模式易于出錯(cuò)滩字,調(diào)試排查比較麻煩