2019-05-11《設(shè)計(jì)模式之裝飾模式》

尊重時(shí)間 時(shí)間才會(huì)尊重你。

「1」說(shuō)明

此乃《設(shè)計(jì)模式》之裝飾模式

「2」裝飾模式定義

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

「3」裝飾(Decotator)模式結(jié)構(gòu)圖

  • Conponent:定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé)。
  • ConcreteComponent:定義一個(gè)具體的對(duì)象,也可以給這個(gè)對(duì)象添加一些職責(zé)。
  • Decorator:裝飾抽象類,繼承了Component,從外類來(lái)擴(kuò)展Component類的功能,但是對(duì)于Component來(lái)說(shuō),是無(wú)需知道Decorator的存在的。
  • ConreteDecorator:具體的裝飾對(duì)象,給Component添加功能。

「4」什么時(shí)候使用裝飾及模式和它好處

  • 裝飾模式是為已有功能動(dòng)態(tài)地添加更多功能的一種方式。當(dāng)系統(tǒng)需要新功能的時(shí)候,是向舊的類中添加新的代碼。這些新加的代碼通常裝飾了原有類的核心職責(zé)和主要行為。它們?cè)谥黝愔屑尤肓诵碌淖侄?,新的方法和新的邏輯,從而增加了主類的?fù)雜度,而這些新加入的東西僅僅是為了滿足一些只在特定情況下才會(huì)執(zhí)行的特殊行為的需要。而裝飾模式卻提供了一個(gè)非常好的解決方案,它把每個(gè)要裝飾的功能放在單獨(dú)的類中,并讓這個(gè)類包裝它所要裝飾的對(duì)象,因此,當(dāng)需要執(zhí)行特殊行為時(shí),客戶代碼就可以在運(yùn)行時(shí)根據(jù)需要有選擇地、按順序地使用裝飾功能包裝對(duì)象了。
  • 優(yōu)點(diǎn)就是把類中的裝飾功能從類中搬移去除,有效地把類中的核心職責(zé)和裝飾功能區(qū)分開,這樣可以簡(jiǎn)化相關(guān)類中重復(fù)的裝飾邏輯。

「5」裝飾模式基本代碼推演

  • Component類
abstract class Component
{
    public abstract void Operation();
}
  • ConcreteComponent類
class ConcreteComponent : Component
{
    public override void Operation()
{
    Console.WriteLine("具體對(duì)象的操作");
}
}
  • Decorator類
abstract class Decorator : Component
{
      protected Component component;
      public void SetComponent(Component conponent)
    {
          this.component = component;
    }
     
    public override void Operation()
    {
      if(component != NULL)
    {
         component.Operation();
    }
    }      
}

ConcreteDecorator類

class ConcreteDecoratorA : Decorator
{
    private string addedState;
    public override void Operation()
     {
        base.Opetation();
        addedState = "New State";
       Console.WriteLine("具體裝飾對(duì)象A的操作");
     }
}

class ConcreteDecoratorB : Decorator
{
    public override void Operation()
     {
        base.Opetation();
        AddedBehavior;
       Console.WriteLine("具體裝飾對(duì)B的操作");
     }
     private void AddedBehavior()
    {
    }
}
  • 客戶端代碼
static void Main()
{
      ConcreteComponent c = new ConcreteComponent();
      ConcreteDecoratorA d1 = new ConcreteDecoratorA;
      ConcreteDecoratorB d2 = new ConcreteDecoratorB;
      d1.SetComponent(c);
      d2.SetComponent(d1);
      Console.Read();
}

「6」裝飾模式總結(jié)

裝飾模式把類中的裝飾功能從類中搬移去除,有效地把類中的核心職責(zé)和裝飾功能區(qū)分開,這樣可以簡(jiǎn)化相關(guān)類中重復(fù)的裝飾邏輯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★☆☆】直接出處:裝飾模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 852評(píng)論 2 2
  • 1 場(chǎng)景問(wèn)題# 1.1 復(fù)雜的獎(jiǎng)金計(jì)算## 考慮這樣一個(gè)實(shí)際應(yīng)用:就是如何實(shí)現(xiàn)靈活的獎(jiǎng)金計(jì)算。 獎(jiǎng)金計(jì)算是相對(duì)復(fù)雜...
    七寸知架構(gòu)閱讀 4,310評(píng)論 4 67
  • 概念:標(biāo)準(zhǔn)的裝飾模式有包括一個(gè)抽象的Component父類,它聲明了一些操作,它具體的類講進(jìn)行重載以實(shí)現(xiàn)自己特定的...
    平頭僧閱讀 369評(píng)論 0 0
  • 設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)...
    于先笙閱讀 594評(píng)論 1 3
  • 9:00——12:00 日本班 堀江老師 【活動(dòng)】北大青年“國(guó)是論壇”:教育質(zhì)量與教育公平 論壇主題:教育質(zhì)量與教...
    dq920813閱讀 125評(píng)論 0 0

友情鏈接更多精彩內(nèi)容