程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 裝飾模式C#

裝飾模式C#

編輯:C#入門知識

裝飾模式C#


1.概述
  裝飾者模式,英文名叫做Decorator Pattern。裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

2.特點
  (1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就可以和真實對象相同的方式和裝飾對象交互。
  (2) 裝飾對象包含一個真實對象的引用(reference)
  (3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
  (4) 裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
3.應用范圍
  1. 需要擴展一個類的功能,或給一個類添加附加職責。
  2. 需要動態的給一個對象添加功能,這些功能可以再動態的撤銷。
  3. 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變的不現實。
  4. 當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。
4.優點
  1. Decorator模式與繼承關系的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
  2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。(這一條更能體現)
5.缺點
  1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的復雜性。
  2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很復雜。
  3. 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行為,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇
6.設計原則
  1. 多用組合,少用繼承。
  利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴展對象的行為,就可以在運行時動態地進行擴展。

  2. 類應設計的對擴展開放,對修改關閉。

實例:

    // 裝飾者模式抽象類 
public abstract class BaseDecorator
    {       
        protected ReturnInfo returnInfo = new ReturnInfo() { Code = 1, IsSuccess = false };
        public BaseDecorator decorator = null;
      //裝飾者模式必須要傳入上一個裝飾者對象,如果沒有則傳null
        public BaseDecorator(BaseDecorator _decorator)
        {
            decorator = _decorator;
        }       
        // 執行方法      
        public abstract ReturnInfo Run(string orderId,string supplierId,string supOrderId);
      
        // 返回結果      
        protected ReturnInfo GetResult()
        {
            returnInfo.Code = 0;
            returnInfo.IsSuccess = true;
            returnInfo.Message = "操作成功";
            return returnInfo;
        }
    }
 public class DecoratorA:BaseDecorator
 {
    public DecoratorA(BaseDecorator decorator)
            : base(decorator)
        { 
            
        }
        public override Model.ReturnInfo Run(string orderId, string supplierId, string supOrderId)
        {
           //具體執行的方法
          //判斷是否還有裝飾者需要執行
            if (decorator!=null)
            {
                return decorator.Run(orderId, supplierId,supOrderId);
            }
            else
            {
                return GetResult();
            }
        }
 }
 public class DecoratorB:BaseDecorator
 {
    public DecoratorB(BaseDecorator decorator)
            : base(decorator)
        { 
            
        }
        public override Model.ReturnInfo Run(string orderId, string supplierId, string supOrderId)
        {
           //具體執行的方法
          //判斷是否還有裝飾者需要執行
            if (decorator!=null)
            {
                return decorator.Run(orderId, supplierId,supOrderId);
            }
            else
            {
                return GetResult();
            }
        }
 }
public class Test
{ 
     BaseDecorator decorator = new DecoratorA(null);
     decorator = new DecoratorB(decorator);
     //程序是從下往上執行的
     return decorator.Run(orderId,supplierId,supOrderId);
}











  1. 上一頁:
  2. 下一頁: