成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

裝飾者模式

el09xccxy / 1386人閱讀

摘要:裝飾者模式裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。思維模式首先需要明確一點(diǎn)裝飾者模式利用了組合的思想,避免了繼承的濫用。裝飾者模式的實(shí)現(xiàn)我們可以先為每一個(gè)零部件確定成本,然后根據(jù)需要,動(dòng)態(tài)地組裝組合一個(gè)機(jī)器人。

裝飾者模式
裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。
思維模式

首先需要明確一點(diǎn):裝飾者模式利用了“組合”的思想,避免了“繼承”的濫用。
通過(guò)動(dòng)態(tài)地組合對(duì)象,可以寫(xiě)新的代碼添加新功能,而無(wú)需修改現(xiàn)有代碼。

這就好比拼裝一個(gè)機(jī)器人。
我們有各種各樣的零部件:

軀干

類(lèi)人的胳膊

帶有鉗子的胳膊

類(lèi)人的腿

帶輪子的腿

帶履帶的腿

……

簡(jiǎn)單粗暴的實(shí)現(xiàn)

想要設(shè)計(jì)各式各樣的機(jī)器人,當(dāng)然我們可以選擇,設(shè)計(jì)一個(gè)Robot超類(lèi),然后讓子類(lèi)繼承這個(gè)超類(lèi)。
這樣,我們可以得到:

軀干+人的胳膊+履帶腿

軀干+鉗子胳膊+輪子腿

軀干+4個(gè)人的胳膊+履帶腿

……

根據(jù)排列組合的原理,如果我們需要,Robot的子類(lèi)可以有無(wú)限多個(gè)。
假如我們從Robot父類(lèi)處繼承了一個(gè)cost()方法,這個(gè)方法根據(jù)該子類(lèi)的component(組件)個(gè)數(shù)和數(shù)量來(lái)計(jì)算成本(cost),那么我們的cost()方法可以說(shuō)要重寫(xiě)無(wú)數(shù)次——因?yàn)槊恳粋€(gè)子類(lèi)的情況都是不一樣的。

“裝飾者模式”的實(shí)現(xiàn)

我們可以先為每一個(gè)零部件(component)確定成本,然后根據(jù)需要,動(dòng)態(tài)地組裝(組合)一個(gè)機(jī)器人。然后將所有的成本加起來(lái)。如此一來(lái),不僅可以得到一個(gè)符合我們需求的機(jī)器人對(duì)象,更能很方便地計(jì)算cost。

軀干 $100

類(lèi)人的胳膊 $40

帶有鉗子的胳膊 $50

類(lèi)人的腿 $70

帶輪子的腿 $70

帶履帶的腿 $50

……

組合一個(gè)有軀干+類(lèi)人的胳膊+帶履帶的腿的機(jī)器人的cost也就是:
100 + 40 + 50 = $190;

實(shí)現(xiàn)組合

所謂組合,也就是我中有你。

如圖所示:


通過(guò)保有各個(gè)對(duì)象的引用,即可實(shí)現(xiàn)“組合”。

對(duì)于這樣一個(gè)組合來(lái)的Robot對(duì)象,我們不妨稱(chēng)其為:“robotTom”。
想要求得總成本,可以直接調(diào)用robotTom.cost();

這是怎樣實(shí)現(xiàn)的呢?
如圖所示:

用公式來(lái)表示就是:

[robotTom].cost() 
= [arm + body].cost() + leg.cost() 
= [body].cost() + arm.cost() + leg.cost() 
=  body.cost() + arm.cost() + leg.cost();

這里用“l(fā)eg對(duì)象包住arm對(duì)象”來(lái)形容leg對(duì)象中有arm對(duì)象的引用,不過(guò)對(duì)于一個(gè)機(jī)器人而言,“l(fā)eg能包住arm”好像有點(diǎn)魔幻現(xiàn)實(shí)的味道。

再舉一例

我們不妨再舉一個(gè)更容易理解的例子:

我們知道,各類(lèi)繪圖軟件中都有圖層(layer)的概念。
每一個(gè)圖層都相當(dāng)于一層透明紙,我們可以在上面任意地畫(huà)東西,而不會(huì)影響其他圖層。
把畫(huà)著東西的圖層一層一層地疊放(相當(dāng)于“包裝”)起來(lái),我們就可以得到各式各樣的畫(huà)作。
此時(shí),位于上一層的圖層就相當(dāng)于裝飾者,而所謂的背景圖層就相當(dāng)于被裝飾者

類(lèi)圖


其中,

Layer、LayerDecorator為抽象類(lèi)

LayerDecorator本質(zhì)上也是Layer

description是各個(gè)layer對(duì)象的自我描述

position()表示layer對(duì)象在某個(gè)地方畫(huà)一個(gè)圖形

RedBackgroundLayerBlueBackgroundLayer相當(dāng)于被裝飾者

對(duì)應(yīng)的代碼:
Layer.java:

public abstract class Layer {

    String description = "我是抽象layer父類(lèi)";

    public String getDescription() {
        return description;
    }

    public abstract String position();
}

RedBackgroundLayer.java

public class RedBackgroundLayer extends Layer {


    public RedBackgroundLayer (){
        //從抽象父類(lèi)layer繼承來(lái)的description
        description = "我是RedBackgroundLayer->" ;
    }

    @Override
    public String position() {
        return "我在底層畫(huà)一個(gè)紅色的layer->";
    }

}

BlueBackgroundLayer.java

public class BlueBackgroundLayer extends Layer {

    public BlueBackgroundLayer() {
        description = "我是一個(gè)BlueBackgroundLayer";
    }


    @Override
    public String position() {
        return null;
    }
}

各個(gè)裝飾者:
RectangleLayerDecorator.java

public class RectangleLayerDecorator extends LayerDecorator {

    Layer layer; 

    //constructor
    public RectangleLayerDecorator(Layer layer) {//這一步很重要
        this.layer = layer;
    }

    @Override
    public String getDescription() {
        return layer.getDescription() + "RectangleLayerDecorator->";
    }

    @Override
    public String position() {
        return layer.position() + "左上角畫(huà)□->";
    }
}

TriangleLayerDecorator.java

public class TriangleLayerDecorator extends LayerDecorator{

    Layer layer;

    //constructor
    public TriangleLayerDecorator(Layer layer) {
        this.layer = layer;
    }

    @Override
    public String getDescription() {
        return layer.getDescription() + "TriangleLayerDecorator->";
    }

    @Override
    public String position() {
        return layer.position() + "右上角畫(huà)△->";
    }
}

RoundLayerDecorator.java

public class RoundLayerDecorator extends LayerDecorator {

    Layer layer;
    //constructor
    public RoundLayerDecorator(Layer layer) {
        this.layer = layer;
    }

    @Override
    public String getDescription() {
        return layer.getDescription() + "RoundLayerDecorator->";
    }

    @Override
    public String position() {
        return layer.position() + "右下角畫(huà)○->";
    }
}
運(yùn)行Demo

RunDemoTest.java

public class RunDemoTest {

    public static void main (String[] args ){
//Step 1
        Layer backgroundLayer = new RedBackgroundLayer();
        System.out.println(backgroundLayer.getDescription() + backgroundLayer.position());
//Step 2
        //為RedBackgroundLayer裝飾一個(gè)TriangleLayerDecorator
        Layer multipleLayer = new TriangleLayerDecorator(backgroundLayer);
//Step 3
        //再裝飾一個(gè)RectangleLayerDecorator
        multipleLayer = new RectangleLayerDecorator(multipleLayer);
//Step 4
        //再裝飾一個(gè)RoundLayerDecorator
        multipleLayer = new RoundLayerDecorator(multipleLayer);

        System.out.println(multipleLayer.getDescription() + multipleLayer.position());

    }
}

運(yùn)行結(jié)果:

我是RedBackgroundLayer->我在底層畫(huà)一個(gè)紅色的layer->
我是RedBackgroundLayer->TriangleLayerDecorator->RectangleLayerDecorator->RoundLayerDecorator->我在底層畫(huà)一個(gè)紅色的layer->右上角畫(huà)△->左上角畫(huà)□->右下角畫(huà)○->

運(yùn)行過(guò)程示意圖:


最終得到:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74811.html

相關(guān)文章

  • Java 設(shè)計(jì)模式裝飾模式

    摘要:裝飾者模式組成結(jié)構(gòu)抽象構(gòu)件給出抽象接口或抽象類(lèi),以規(guī)范準(zhǔn)備接收附加功能的對(duì)象。裝飾者模式圖解裝飾者模式應(yīng)用場(chǎng)景需要擴(kuò)展一個(gè)類(lèi)的功能,或給一個(gè)類(lèi)添加附加職責(zé)。裝飾者對(duì)象接受所有來(lái)自客戶(hù)端的請(qǐng)求。參考資料設(shè)計(jì)模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾者來(lái)包裹真實(shí)的對(duì)...

    kumfo 評(píng)論0 收藏0
  • 設(shè)計(jì)模式裝飾模式

    摘要:相關(guān)設(shè)計(jì)模式裝飾者模式和代理模式裝飾者模式關(guān)注再一個(gè)對(duì)象上動(dòng)態(tài)添加方法代理模式關(guān)注再對(duì)代理對(duì)象的控制訪(fǎng)問(wèn),可以對(duì)客戶(hù)隱藏被代理類(lèi)的信息裝飾著模式和適配器模式都叫包裝模式關(guān)于新職責(zé)適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。 0x01.定義與類(lèi)型 定義:裝飾模式指的是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的...

    chuyao 評(píng)論0 收藏0
  • 設(shè)計(jì)模式——裝飾模式

    摘要:裝飾者模式遵循了開(kāi)閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。但是在使用裝飾者模式的同時(shí)可能會(huì)引入大量小類(lèi),而且使用裝飾者模式除了實(shí)例化組件外,還要把組件包裝進(jìn)裝飾者,會(huì)使代碼顯得不易理解。 1. 簡(jiǎn)介 ??裝飾者模式是一種結(jié)構(gòu)型模式,它可以動(dòng)態(tài)的將責(zé)任附加到對(duì)象上,在擴(kuò)展功能方面,它比繼承更有彈性。裝飾者模式遵循了開(kāi)閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。??雖然在裝飾者模式中也使用了繼承,但是繼承只是...

    hoohack 評(píng)論0 收藏0
  • 代理模式裝飾模式

    摘要:簡(jiǎn)介代理模式和裝飾者模式是兩種常見(jiàn)的設(shè)計(jì)模式。這里通過(guò)構(gòu)造函數(shù)的參數(shù)將被代理對(duì)象傳入到代理中,也可以通過(guò)其它方式,如提供一個(gè)方法。下面是的代碼輸出首先依然是先創(chuàng)建一個(gè)需要被代理的對(duì)象,然后把它傳入到的構(gòu)造函數(shù)中。 簡(jiǎn)介 代理模式和裝飾者模式是兩種常見(jiàn)的設(shè)計(jì)模式。代理模式是為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以...

    NusterCache 評(píng)論0 收藏0
  • 美顏相機(jī)中的設(shè)計(jì)模式 —— 裝飾模式

    摘要:這是設(shè)計(jì)模式系列的第二篇,系列文章目錄如下用一句話(huà)總結(jié)那些殊途同歸的設(shè)計(jì)模式工廠(chǎng)策略模版方法美顏相機(jī)中的設(shè)計(jì)模式裝飾者模式幾乎所有的設(shè)計(jì)模式都是通過(guò)增加一層抽象來(lái)解決問(wèn)題。 這是設(shè)計(jì)模式系列的第二篇,系列文章目錄如下: 用一句話(huà)總結(jié)那些殊途同歸的設(shè)計(jì)模式:工廠(chǎng)=?策略=?模版方法 美顏相機(jī)中的設(shè)計(jì)模式——裝飾者模式 幾乎所有的設(shè)計(jì)模式都是通過(guò)增加一層抽象來(lái)解決問(wèn)題。 上一篇中提...

    anonymoussf 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式----裝飾模式

    摘要:聲明這個(gè)系列為閱讀設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐曾探著一書(shū)的讀書(shū)筆記裝飾者模式的定義裝飾者模式能夠在不改變對(duì)象自身的基礎(chǔ)上,在程序運(yùn)行期間給對(duì)像動(dòng)態(tài)的添加職責(zé)。與繼承相比,裝飾者是一種更輕便靈活的做法。裝飾者模式的作用就是為對(duì)象動(dòng)態(tài)的加入某些行為。 聲明:這個(gè)系列為閱讀《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 ----曾探@著一書(shū)的讀書(shū)筆記 裝飾者模式的定義: 裝飾者(decorator)模式能...

    rose 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<