Net設計模式例項之裝飾者模式(Decorator Pattern)

weixin_33766168發表於2017-08-10

一、裝飾模式簡介(Brief Introduction

動態地給一個物件新增一些額外的職責。

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

 

二、解決的問題(What To Solve

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

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

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

三、裝飾模式分析(Analysis

1、裝飾模式結構

Component定義了一個物件介面,可以給這些物件動態地新增職責。

ComcreteComponent定了一個具體的物件,也可以給這個具體的物件新增職責。

Decorator抽象裝飾類,繼承了Component物件介面,從外類擴充套件Component類的功能,但對於Component來說,是無需知道Decorator的存在。

ConcreteDecoratorA具體的裝飾物件,起到給Component新增職責的功能。

ConcreteDecoratorB具體的裝飾物件,起到給Component新增職責的功能。

2、原始碼

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;

    }

 

    public override void Operation()

    {

        if (m_Component != null)

       {

            m_Component.Operation();

       }

    }

}

 

4、具體的裝飾物件ConcreteDecoratorA.cs 繼承於Decorator抽象類

public class ConcreteDecoratorA : Decorator

{

    private string addedState;

    public override void Operation()

    {

        base.Operation();

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

        Console.WriteLine(addedState);

    }

}

給物件介面Component新增了狀態屬性addedState

 

5、具體的裝飾物件ConcreteDecoratorB.cs 繼承於Decorator抽象類

public class ConcreteDecoratorB : Decorator

{

    public override void Operation()

    {

        base.Operation();

        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();

}

給物件介面Component新增了操作行為AddedBehavior()

3、程式執行結果

四.案例分析(Example

此案例對具體元件TextView進行了BorderScrollBar的裝飾。使TextView更符合專案需求。

五、總結(Summary

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


            本文轉自靈動生活部落格園部落格,原文連結: http://www.cnblogs.com/ywqu/archive/2010/01/19/1651212.html ,如需轉載請自行聯絡原作者


相關文章