程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .net設計模式實例之裝飾者模式(Decorator Pattern)

.net設計模式實例之裝飾者模式(Decorator Pattern)

編輯:關於.NET

一、裝飾模式簡介(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)

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

出處:http://www.cnblogs.com/ywqu

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved