日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計(jì)模式-裝飾模式學(xué)習(xí)筆記

 新進(jìn)小設(shè)計(jì) 2020-07-07

裝飾模式(結(jié)構(gòu)型模式)

裝飾模式(Decorator),動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活。[DP]

 

自己的理解在不對(duì)原有類進(jìn)行修改的情況下動(dòng)態(tài)的對(duì)它進(jìn)行擴(kuò)展一些功能 


 

  • 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 滿足開閉原則
  2. 能夠動(dòng)態(tài)的增刪功能,比繼承更靈活

缺點(diǎn):

  1. 會(huì)多出很多小類,增加了程序的復(fù)雜性
  2. 難以排錯(cuò)(多級(jí)裝飾的對(duì)象,排錯(cuò)需要逐級(jí)排查)

 

  • 特點(diǎn)
  1. 裝飾對(duì)象和被裝飾對(duì)象有共同的父類
  2. 裝飾對(duì)象持有一個(gè)被裝飾對(duì)象的實(shí)例(體現(xiàn)為擁有一個(gè)屬性是父接口的對(duì)象)
  3. 裝飾對(duì)象對(duì)調(diào)用方傳過來的請(qǐng)求會(huì)轉(zhuǎn)發(fā)給被裝飾對(duì)象(體現(xiàn)為所有的子裝飾類在操作時(shí)都會(huì)調(diào)用裝飾類的方法,而裝飾類會(huì)通過調(diào)用父接口對(duì)象的方法去調(diào)用被裝飾對(duì)象的方法)
  4. 子裝飾類在調(diào)用裝飾對(duì)象的方法時(shí)會(huì)新增其他一些附加功能(裝飾模式的意義)

 

 

  • 結(jié)構(gòu)

Component:裝飾對(duì)象和被裝飾對(duì)象的共同父類

ConcreteComponent:被裝飾類,也為具體實(shí)現(xiàn)類

Decorator:裝飾類,自裝飾類的父類

ConcreteDecoratorA:子裝飾類,提供特定的裝飾

ConcreteDecoratorB:子裝飾類,提供特定的裝飾

更多的ConcreteDecorator(C,D,E,F)


 

  • 代碼

例子:武裝機(jī)甲,一臺(tái)機(jī)甲,沒有任何裝備,現(xiàn)在需要給機(jī)甲裝上各種裝備,機(jī)甲是被裝飾對(duì)象,給機(jī)甲新增裝備為裝飾類,動(dòng)態(tài)的添加武器裝備和防具裝備

       被裝飾對(duì)象與裝飾對(duì)象的共同父類

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:02
 * @ Description:裝飾對(duì)象和被裝飾對(duì)象的共同父類
 */
public interface Component {
     void operation();
}

  被裝飾對(duì)象,擁有完整的操作

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:06
 * @ Description:被裝飾者對(duì)象   機(jī)甲類
 */
public class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("末日機(jī)甲前來報(bào)道,裝備:");
    }
}

  裝飾類,持有一個(gè)被裝飾對(duì)象的引用,并且在被調(diào)用時(shí),調(diào)用被裝飾對(duì)象的方法

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:09
 * @ Description:裝飾類  
 */
public abstract class Decorator implements Component {

    //持有一個(gè)被裝飾對(duì)象的引用
    private Component component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if(component != null){
            component.operation();
        }
    }
}

  子裝飾類,在調(diào)用提供特定的裝飾操作時(shí),調(diào)用父類方法

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:18
 * @ Description:具體裝飾類  機(jī)甲裝備武器改裝類
 */
public class ConcreteDecoratorA extends Decorator{
    @Override
    public void operation() {
        super.operation();
        System.out.println("改裝:等離子高頻激光劍");
    }
} 

  同上

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:28
 * @ Description:具體裝飾類  機(jī)甲裝備防具改裝類
 */
public class ConcreteDecoratorB extends Decorator{
    @Override
    public void operation() {
        super.operation();
        System.out.println("改裝:全適應(yīng)立場(chǎng)防護(hù)盾");
    }
}

        客戶端調(diào)用類

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:00
 * @ Description:客戶端調(diào)用類
 */
public class TestController {
    public void print(){
        ConcreteComponent concreteComponent = new ConcreteComponent();
        ConcreteDecoratorA cA = new ConcreteDecoratorA();
        ConcreteDecoratorB cB = new ConcreteDecoratorB();
        cA.setComponent(concreteComponent);
        cB.setComponent(cA);
        cB.operation();
    }
}

  

輸出結(jié)果:

末日機(jī)甲前來報(bào)到,裝備:
改裝:等離子高頻激光劍
改裝:全適應(yīng)立場(chǎng)防護(hù)盾  

  


 

  • 總結(jié)

裝飾模式能動(dòng)態(tài)的擴(kuò)展一個(gè)類,并且不修改原來的類,能夠靈活的增刪,比繼承要好。(感覺作用和代理模式有點(diǎn)象^_^)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多