天天看點

Net設計模式執行個體之裝飾者模式(Decorator Pattern)

動态地給一個對象添加一些額外的職責。

優點:把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功能和裝飾功能區分開了。

已經開發完畢的對象,後期由于業務需要,對舊的對象需要擴充特别多的功能,這時候使用給對象動态地添加新的狀态或者行為(即裝飾模式)方法,而不是使用子類靜态繼承。

比如,剛買一輛汽車如下圖

Net設計模式執行個體之裝飾者模式(Decorator Pattern)

此汽車不符合你的個性要求,比如外表不夠美觀,發動機馬力不足,不能滿足你的速度激情,于是你需要對汽車的外表進行裝飾,同時需要提高發動機的性能。這些操作通過裝飾模式就能很好地解決問題。最終得到如下圖所示的個性汽車。

Net設計模式執行個體之裝飾者模式(Decorator Pattern)
Net設計模式執行個體之裝飾者模式(Decorator Pattern)

Component定義了一個對象接口,可以給這些對象動态地添加職責。

ComcreteComponent定了一個具體的對象,也可以給這個具體的對象添加職責。

Decorator抽象裝飾類,繼承了Component對象接口,從外類擴充Component類的功能,但對于Component來說,是無需知道Decorator的存在。

ConcreteDecoratorA具體的裝飾對象,起到給Component添加職責的功能。

ConcreteDecoratorB具體的裝飾對象,起到給Component添加職責的功能。

1、對象接口Component.cs

public abstract class Component

{

    public abstract void Operation();

}

2、實作類ConcreteComponent.cs 繼承于Component接口

public class ConcreteComponent : Component

    public override void Operation()

    {

        Console.WriteLine("開始執行具體的對象...");

    }

3、裝飾抽象類Decorator.cs 繼承于Component接口

public abstract class Decorator : Component

    private Component m_Component;

    public void SetComponent(Component component)

        this.m_Component = component;

        if (m_Component != null)

       {

            m_Component.Operation();

       }

4、具體的裝飾對象ConcreteDecoratorA.cs 繼承于Decorator抽象類

public class ConcreteDecoratorA : Decorator

    private string addedState;

        base.Operation();

        addedState = "進行了狀态屬性裝飾。";

        Console.WriteLine(addedState);

給對象接口Component添加了狀态屬性addedState

5、具體的裝飾對象ConcreteDecoratorB.cs 繼承于Decorator抽象類

public class ConcreteDecoratorB : Decorator

        AddedBehavior();

    private void AddedBehavior()

        Console.WriteLine("進行了操作行為裝飾。");

給對象接口Component添加了操作行為AddedBehavior()

5、用戶端代碼

static void Main(string[] args)

    ConcreteComponent cc = new ConcreteComponent();

    ConcreteDecoratorA cda = new ConcreteDecoratorA();

    ConcreteDecoratorB cdb = new ConcreteDecoratorB();

    cda.SetComponent(cc);

    cdb.SetComponent(cda);

    cdb.Operation();

    Console.Read();

Net設計模式執行個體之裝飾者模式(Decorator Pattern)
Net設計模式執行個體之裝飾者模式(Decorator Pattern)

此案例對具體元件TextView進行了Border和ScrollBar的裝飾。使TextView更符合項目需求。

裝飾模式,給一個對象動态添加額外職責,這些職責需要由使用者決定加入的方式和時機。裝飾模式提供了“即插即用”的方式,在運作期間決定何時增加何種功能。就增加功能來說,裝飾模式比生成子類更加靈活。

版權

作者:靈動生活 郝憲玮

如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,

Net設計模式執行個體之裝飾者模式(Decorator Pattern)

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀