1、定義
動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾著提供了比繼承者更有彈性的替代方案。
2、原則
為交互對(duì)象之間的耦合設(shè)計(jì)而努力
對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉
3、適用環(huán)境
在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
處理那些可以撤消的職責(zé)。
當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。
4、本模式中的角色
(圖例)
具體例子:
先定義抽象構(gòu)件:
package decorator;
//抽象構(gòu)件接口
public interface Component{
public void sampleOperation();
}
一個(gè)具體構(gòu)件----門:
package decorator;
//具體構(gòu)件-----門
public class Door implements Component{
//實(shí)現(xiàn)方法
public void sampleOperation(){
System.out.println("build a door");
}
}
裝飾(抽象類):
package decorator;

public abstract class Decorator implements Component{
//持有一個(gè)構(gòu)件對(duì)象的實(shí)例
private Component component;
//構(gòu)造方法
public Decorator(Component component){
this.component=component;
}
//方法的具體實(shí)現(xiàn)
public void sampleOperation(){
component.sampleOperation();
}
}
具體裝飾:
package decorator;
//具體裝飾----把手
public class Knob extends Decorator{

public Knob(Component component){
super(component);
}
public void sampleOperation(){
super.sampleOperation();
//附加的"責(zé)任"
System.out.println("add a knob");
}
}
package decorator;
//具體裝飾----鎖
public class Lock extends Decorator{

public Lock(Component component){
super(component);
}
public void sampleOperation(){
super.sampleOperation();
//附加"責(zé)任"
System.out.println("add a lock");
}
}
運(yùn)行類:
package decorator;

public class DecoratorPattern{
public static void main(String[] args){
Component door=new Door();
Component lock=new Lock(door);
Component knob=new Knob(lock);
knob.sampleOperation();
}
}
運(yùn)行結(jié)果:
build a door
add a lock
add a knob
Press any key to continue...
參考資料:《Head First 設(shè)計(jì)模式》
設(shè)計(jì)模式學(xué)習(xí)筆記(十)--------裝飾(Decorator)模式
動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾著提供了比繼承者更有彈性的替代方案。
2、原則
為交互對(duì)象之間的耦合設(shè)計(jì)而努力
對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉
3、適用環(huán)境
在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
處理那些可以撤消的職責(zé)。
當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。
4、本模式中的角色
抽象構(gòu)件(Component):給出一個(gè)抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。
具體構(gòu)件(Concrete Component):定義一個(gè)接收到附加責(zé)任的類。
裝飾(Decorator):持有一個(gè)構(gòu)件對(duì)象的實(shí)例,并定義與抽象構(gòu)件一致的接口。
具體裝飾(Concrete Decorator):負(fù)責(zé)給構(gòu)件對(duì)象貼上附加的責(zé)任。

具體例子:
先定義抽象構(gòu)件:





一個(gè)具體構(gòu)件----門:








裝飾(抽象類):














具體裝飾:





































運(yùn)行結(jié)果:
build a door
add a lock
add a knob
Press any key to continue...
參考資料:《Head First 設(shè)計(jì)模式》
設(shè)計(jì)模式學(xué)習(xí)筆記(十)--------裝飾(Decorator)模式