国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【23種設(shè)計模式】裝飾模式(九)

這篇具有很好參考價值的文章主要介紹了【23種設(shè)計模式】裝飾模式(九)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

裝飾模式,英文名稱:Decorator Pattern。我第一次看到這個名稱想到的是另外一個詞語“裝修”,我就說說我對“裝修”的理解吧,大家一定要看清楚,是“裝修”,不是“裝飾”。在房子裝修的過程中,各種功能可以相互組合,來增加房子的功用。類似的,如果我們在軟件系統(tǒng)中,要給某個類型或者對象增加功能,如果使用“繼承”的方案來寫代碼,就會出現(xiàn)子類暴漲的情況。比如:IMarbleStyle是大理石風(fēng)格的一個功能,IKeepWarm是保溫的一個接口定義,IHouseSecurity是房子安全的一個接口,就三個接口來說,House是我們房子,我們的房子要什么功能就實現(xiàn)什么接口,如果房子要的是復(fù)合功能,接口不同的組合就有不同的結(jié)果,這樣就導(dǎo)致我們子類膨脹嚴(yán)重,如果需要在增加功能,子類會成指數(shù)增長。

裝飾模式的定義

上述的問題的根源在于我們“過度地使用了繼承來擴展對象的功能”,由于繼承為類型引入的靜態(tài)特質(zhì),所謂靜態(tài)特質(zhì),就是說如果想要某種功能,我們必須在編譯的時候就要定義這個類,這也是強類型語言的特點。靜態(tài),就是指在編譯的時候要確定的東西;動態(tài),是指運行時確定的東西。使得這種擴展方式缺乏靈活性;并且隨著子類的增多(擴展功能的增多),各種子類的組合(擴展功能的組合)會導(dǎo)致更多子類的膨脹(多繼承)。如何使“對象功能的擴展”能夠根據(jù)需要來動態(tài)(即運行時)地實現(xiàn)?同時避免“擴展功能的增多”帶來的子類膨脹問題?從而使得任何“功能擴展變化”所導(dǎo)致的影響降為最低?裝飾者模式解決此問題應(yīng)運而生,動態(tài)地給一個對象增加一些額外的職責(zé)。

裝飾模式的組成

  • 抽象構(gòu)件角色(Component):給出一個抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對象。

  • 具體構(gòu)件角色(Concrete Component):定義一個將要接收附加責(zé)任的類。

  • 裝飾角色(Decorator):持有一個構(gòu)件(Component)對象的實例,并實現(xiàn)一個與抽象構(gòu)件接口一致的接口。

  • 具體裝飾角色(Concrete Decorator):負責(zé)給構(gòu)件對象添加上附加的責(zé)任。
    【23種設(shè)計模式】裝飾模式(九)

裝飾模式的實現(xiàn)

以裝修房子為例,完成裝飾著模式的代碼實現(xiàn)

房子定義
    /// <summary>
    /// 該抽象類就是房子抽象接口的定義,該類型就相當(dāng)于是Component類型,是餃子餡,需要裝飾的,需要包裝的
    /// </summary>
    public abstract class House
    {
        /// <summary>
        /// 房子的裝修方法--該操作相當(dāng)于Component類型的Operation方法
        /// </summary>
        public abstract void Renovation();
    }
   /// <summary>
    /// MyHouse的房子,我要按我的要求做房子,相當(dāng)于ConcreteComponent類型
    /// </summary>
    public sealed class MyHouse : House
    {
        public override void Renovation()
        {
            Console.WriteLine("裝修我的房子");
        }
    }
裝飾類的定義
 /// <summary>
    /// 該抽象類就是裝飾接口的定義,該類型就相當(dāng)于是Decorator類型,如果需要具體的功能,可以子類化該類型
    /// </summary>
    public abstract class DecorationStrategy : House //關(guān)鍵點之二,體現(xiàn)關(guān)系為Is-a,有了這個關(guān)系,裝飾的類也可以繼續(xù)裝飾了
    {
        //通過組合方式引用Decorator類型,該類型實施具體功能的增加
        //這是關(guān)鍵點之一,包含關(guān)系,體現(xiàn)為Has-a
        protected House _house;

        //通過構(gòu)造器注入,初始化平臺實現(xiàn)
        protected DecorationStrategy(House house)
        {
            this._house = house;
        }

        //該方法就相當(dāng)于Decorator類型的Operation方法
        public override void Renovation()
        {
            if (this._house != null)
            {
                this._house.Renovation();
            }
        }
    }

安全需求類裝飾定義
/// <summary>
    /// 具有安全功能的設(shè)備,可以提供監(jiān)視和報警功能,相當(dāng)于ConcreteDecoratorA類型
    /// </summary>
    public sealed class HouseSecurityDecorator : DecorationStrategy
    {
        public HouseSecurityDecorator(House house) : base(house) { }

        public override void Renovation()
        {
            base.Renovation();
            Console.WriteLine("增加安全系統(tǒng)");
        }
    }
保暖需求類裝飾定義
 /// <summary>
    /// 具有保溫接口的材料,提供保溫功能,相當(dāng)于ConcreteDecoratorB類型
    /// </summary>
    public sealed class KeepWarmDecorator : DecorationStrategy
    {
        public KeepWarmDecorator(House house) : base(house) { }

        public override void Renovation()
        {
            base.Renovation();
            Console.WriteLine("增加保溫的功能");
        }
    }
調(diào)用
   public void RunTest()
        {
            //這就是我們需要裝飾的房子
            House myselfHouse = new MyHouse();

            DecorationStrategy securityHouse = new HouseSecurityDecorator(myselfHouse);
            securityHouse.Renovation();

            /*
             * 此時房子就有了安全系統(tǒng)了.....
             */

            //【1】如果我既要安全系統(tǒng)又要保暖呢,繼續(xù)裝飾就行
            //DecorationStrategy securityAndWarmHouse = new KeepWarmDecorator(myselfHouse);
            //securityAndWarmHouse.Renovation();


            Console.WriteLine("\r\n*****************************\r\n");

            //【2】如果我既要安全系統(tǒng)又要保暖呢,繼續(xù)裝飾就行【和上邊的進行運行比對】
            //【對運行結(jié)果難理解的話,打斷點單步執(zhí)行進行理解】

            DecorationStrategy securityAndWarmHouse1 = new KeepWarmDecorator(securityHouse);
            securityAndWarmHouse1.Renovation();
        }

【23種設(shè)計模式】裝飾模式(九)

裝飾模式的優(yōu)缺點

優(yōu)點
  • 把抽象接口與其實現(xiàn)解耦。

  • 抽象和實現(xiàn)可以獨立擴展,不會影響到對方。

  • 實現(xiàn)細節(jié)對客戶透明,對用戶隱藏了具體實現(xiàn)細節(jié)。文章來源地址http://www.zghlxwxcb.cn/news/detail-707725.html

缺點
  • 增加了系統(tǒng)的復(fù)雜度

到了這里,關(guān)于【23種設(shè)計模式】裝飾模式(九)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 設(shè)計模式-裝飾器模式

    設(shè)計模式-裝飾器模式

    裝飾者模式的定義為:動態(tài)的給一個對象添加其它功能。 從擴展性來說,這種方式比繼承更有彈性,更加靈活,裝飾者模式也體現(xiàn)了開閉原則(OCP)。 星巴克咖啡訂單項目(咖啡館) : 1)咖啡種類/單品咖啡: Espresso(意大利濃咖啡)、ShortBlack、Decaf(無因咖啡)、LongBlack(美式咖啡) 2)

    2024年02月06日
    瀏覽(23)
  • 設(shè)計模式--裝飾者模式

    設(shè)計模式--裝飾者模式

    (1) 可樂種類/單品可樂 :BaiShiCola(百事可樂) FeiChangCola(非常可樂) CoCola(可口可樂) (2) 調(diào)料/附品: Milk? Chocolate (3) 要求在擴展新的可樂種類時 要具有良好的擴展性 改動方便 維護方便 (4) 使用OO的來就算不同之類可樂的費用 客戶可以點單品可樂 也可以單品可樂+調(diào)料組合 方案1?

    2024年02月02日
    瀏覽(20)
  • 設(shè)計模式(3)裝飾模式

    設(shè)計模式(3)裝飾模式

    一、介紹: 1、應(yīng)用場景:把所需的功能按正確的順序串聯(lián)起來進行控制。動態(tài)地給一個對象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更加靈活。 當(dāng)需要給一個現(xiàn)有類添加附加職責(zé),而又不能采用生成子類的方法進行擴充時。例如,該類被隱藏或者該類是

    2024年02月13日
    瀏覽(31)
  • 【設(shè)計模式】-裝飾器模式

    在軟件開發(fā)中,經(jīng)常有需求對已有的對象進行功能的擴展,但是傳統(tǒng)的繼承方式會導(dǎo)致類的數(shù)量快速增多,且難以維護。為了解決這個問題,裝飾器模式應(yīng)運而生。 裝飾器模式是一種結(jié)構(gòu)型設(shè)計模式,它可以在運行時動態(tài)地將新的行為附加到對象上,而不改變其結(jié)構(gòu)。這種方

    2024年02月14日
    瀏覽(18)
  • 設(shè)計模式——裝飾者模式

    設(shè)計模式——裝飾者模式

    更多內(nèi)容,前往 IT-BLOG 現(xiàn)實生活中常常需要給某類產(chǎn)品動態(tài)增加新的功能,如:給面條各種調(diào)味品。在軟件開發(fā)過程中,有時想用一些現(xiàn)存的組件。這些組件可能只是完成一些核心功能。但在不改變其架構(gòu)的情況下,可以動態(tài)地擴展其功能。所以這些都可以采用裝飾模式來實

    2024年02月22日
    瀏覽(17)
  • 【設(shè)計模式】裝飾器模式

    【設(shè)計模式】裝飾器模式

    裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個包裝。 裝飾器模式通過將對象包裝在裝飾器類中,以便動態(tài)地修改其行為。 這種模式創(chuàng)建了一個裝飾類,用來包裝原有的

    2024年02月13日
    瀏覽(19)
  • Java設(shè)計模式-裝飾模式

    裝飾模式在Java領(lǐng)域是一種常見的設(shè)計模式,它能夠在不改變對象原有結(jié)構(gòu)的情況下,動態(tài)地為對象添加新的功能。它通過封裝原有對象,在運行時動態(tài)地為對象添加新的行為或者修改原有行為,以擴展對象的功能。這種方式避免了繼承的靜態(tài)特性,讓對象的行為可以根據(jù)需要

    2024年02月04日
    瀏覽(22)
  • 設(shè)計模式——裝飾器模式09

    設(shè)計模式——裝飾器模式09

    裝飾器模式:是在原有基礎(chǔ)上進行裝飾(無修改原來代碼),來添加新的功能。 例如下面對普通耳機進行裝飾。 設(shè)計模式,一定要敲代碼理解 可加修飾器 抽象 通過委托方式聚合對象,并對其對象進行方法增強。使其 能在不改變對象接口的前提下強化對象功能。 代碼下載

    2024年04月09日
    瀏覽(22)
  • 【前端設(shè)計模式】之裝飾模式

    裝飾模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它允許在不改變原有對象結(jié)構(gòu)的情況下,動態(tài)地給對象添加額外的功能。裝飾模式通過創(chuàng)建一個包裝器(裝飾器)來包裹原有對象,并在保持接口一致性的前提下,增加新的行為或修改原有行為。 繼承或?qū)崿F(xiàn)相同的接口 :裝

    2024年02月09日
    瀏覽(25)
  • 設(shè)計模式之裝飾者模式

    設(shè)計模式之裝飾者模式

    咖啡種類/單品咖啡:Espresso(意大利濃咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(無因咖啡) 調(diào)料:Milk、Soy(豆?jié){)、Chocolate 要求在擴展新的咖啡種類時,具有良好的擴展性、改動方便、維護方便 使用 OO 的來計算不同種類咖啡的費用: 客戶可以點單品咖啡,也可以單品咖啡+調(diào)料組

    2024年02月09日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包