把所需的功能按正確的順序串聯(lián)起來進(jìn)行控制。
Decorator:動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更加靈活。
abstract class Component{    public abstract void Operation();}class ConcreteComponent extends Component{    @override    public void Operation()    {        具體對(duì)象的操作;    }}abstract class Decorator extends Component{    PRotected Component component;    //設(shè)置component    public void setComponent(Component component)    {        this.component = component;    }    //重寫Operation(),實(shí)際執(zhí)行的是Component的Operation()。    @override    public void Operation()    {        if (component != NULL)            component.Operation();    }}class ConcreteDecoratorA extends Decorator{    //本類獨(dú)有的功能,以區(qū)別ConcreteDecoratorB    private string addedState;    //首先運(yùn)行原Component的Operation(),再執(zhí)行本類的功能,如addedState,相當(dāng)于對(duì)原Component進(jìn)行了裝飾。    @override    public void Operation()    {        super.Operation();        addedState =  “New State”;        具體裝飾對(duì)象A的操作;    }}class ConcreteDecoratorB extends Decorator{    //首先運(yùn)行原Component的Operation(),再執(zhí)行本類的功能,如AddedBehavior(),相當(dāng)于對(duì)原Component進(jìn)行了裝飾。    @override    public void Operation()    {        super.Operation();        AddedBehavior();        具體裝飾對(duì)象B的操作;    }    private void AddedBehavior(){ }}static void main(string[] args){    ConcreteComponent c = new ConcreteComponent();    ConcreteDecoraterA da = new ConcreteDecoraterA();    ConcreteDecoraterB db = new ConcreteDecoraterB();    da.setComponent(c);    db.setComponent(da);    db.Operation();}裝飾模式是利用setComponent來對(duì)對(duì)象進(jìn)行包裝。
每個(gè)裝飾對(duì)象的實(shí)現(xiàn)就和如何使用這個(gè)對(duì)象分開了,每個(gè)裝飾對(duì)象只關(guān)心自己的功能,不需要關(guān)心如何被添加到對(duì)象鏈當(dāng)中。
 
如果只有一個(gè)ConcreteComponent類而沒有抽象的Component類,那么Decorator類可以是ConcreteComponent的一個(gè)子類。
同理,如果只有一個(gè)ConcreteDecorator類,那么就沒有必要建立一個(gè)單獨(dú)的Decorator類,而可以把Decorator和ConcreteDecorator的責(zé)任合并成一個(gè)類。
 
裝飾模式總結(jié):
裝飾模式是為已有功能動(dòng)態(tài)的添加更多功能的一種方式。
當(dāng)系統(tǒng)需要新功能的時(shí)候,是向舊的類中添加新的代碼
這些新加的代碼通常裝飾了原有類的核心職責(zé)或主要行為
在主類中加入了新的字段、新的方法和新的邏輯,從而增加了主類的復(fù)雜度。
而這些新加入的東西僅僅是為了滿足一些只在某種特定情況下才會(huì)執(zhí)行的特殊行為的需要。
裝飾器模式提供了一個(gè)非常好的解決方案,它把每個(gè)要裝飾的功能放在單獨(dú)的類中,并讓這個(gè)類包裝它所要裝飾的對(duì)象,因此,當(dāng)需要執(zhí)行特殊行為時(shí),客戶代碼就可以在運(yùn)行時(shí)根據(jù)需要有選擇的、按順序的使用裝飾功能包裝對(duì)象了。
 
裝飾模式的優(yōu)點(diǎn):
把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。
有效的把類的核心職責(zé)和裝飾功能區(qū)分開了,而且可以去除相關(guān)類中重復(fù)的裝飾邏輯。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注