裝飾模式 .

來源:互聯網
上載者:User

[+]

  1. 一裝飾模式簡介Brief Introduction
  2. 二解決的問題What To Solve
  3. 三裝飾模式分析Analysis
    1. 裝飾模式結構
    2. 原始碼
    3. 程式運行結果
  4. 四案例分析Example
  5. 五總結Summary
一、裝飾模式簡介(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進行了Border和ScrollBar的裝飾。使TextView更符合項目需求。

五、總結(Summary)

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

一、裝飾模式簡介(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進行了Border和ScrollBar的裝飾。使TextView更符合項目需求。

五、總結(Summary)

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.