.NET裝飾模式講解

高洛峰
發布: 2016-12-20 13:16:22
原創
1470 人瀏覽過

裝飾模式的定義:

裝飾模式是在不必改變原類別檔案和使用繼承的情況下,動態地擴展一個物件的功能。它是透過創造一個包裝對象,也就是裝飾來包裹真實的對象。

裝飾者模式結構圖:

.NET裝飾模式講解

裝飾者模式角色:

(1)抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加責任的對象。
(2)具體構件(Concrete Component)角色:定義一個將要接收附加責任的類別。 
(3)裝飾(Decorator)角色:持有一個構件(Component)物件的實例,並實作一個與抽象構件介面一致的介面。
(4)具體裝飾(Concrete Decorator)角色:負責為構件物件添加上附加的責任。

實現:

引用生活中的例子,我們買了一部新手機,慢慢的給這部手機添加新的裝飾,比如說貼膜,添加掛件.....

1.首先抽像出手機類,作為裝飾者模式中的抽象組件:

/// <summary>
/// 手机抽象类,即抽象者模式中的抽象组件类
/// </summary>
public abstract class Phone
{
  /// <summary>
  /// 打印方法
  /// </summary>
  public abstract void Print();
}
登入後複製

   

2.假如現在我們買了一部蘋果手機,現在繼承自抽象類,實現具體組件類:

/// <summary>
/// 苹果手机,即装饰着模式中的具体组件类
/// </summary>
public class ApplePhone:Phone
{
  /// <summary>
  /// 重写基类的方法
  /// </summary>
  public override void Print()
  {
    Console.WriteLine("我有一部苹果手机");
  }
}
登入後複製

   .現在我想為這個手機添加新的裝飾,我們先抽像出裝飾類:

/// <summary>
/// 装饰抽象类,让装饰完全取代抽象组件,所以必须继承Phone
/// </summary>
public abstract class Decorator:Phone
{
  private Phone p ;  //该装饰对象装饰到的Phone组件实体对象
   
  public Decorator(Phone p)
  {
    this.p = p;
  }
 
  public override void Print()
  {
    if (this.p != null)
    {
      p.Print();
    }
  }
}
登入後複製

   

4.具體裝飾對象,繼承裝飾抽象類別:這裡具體貼膜裝飾,和掛件裝飾:

/// <summary>
/// 贴膜,具体装饰者
/// </summary>
public class Sticker:Decorator
{
  public Sticker(Phone p) : base(p) { }
 
  public override void Print()
  {
    base.Print();
    //添加行为
    AddSticker();
  }
 
  /// <summary>
  /// 新的行为方法
  /// </summary>
  public void AddSticker()
  {
    Console.WriteLine("现在苹果手机有贴膜了");
  }
}
登入後複製
/// <summary>
/// 手机挂件,即具体装饰者
/// </summary>
public class Accessories:Decorator
{
  public Accessories(Phone p) : base(p) { }
 
  public override void Print()
  {
    base.Print();
 
    // 添加新的行为
    AddAccessories();
  }
 
  /// <summary>
  /// 新的行为方法
  /// </summary>
  public void AddAccessories()
  {
    Console.WriteLine("现在苹果手机有漂亮的挂件了");
  }
}
登入後複製

5.調用:

/// <summary>
/// 设计模式-装饰者模式
/// </summary>
class Program
{
  static void Main(string[] args)
  {
    Phone ap = new ApplePhone(); //新买了个苹果手机
    Decorator aps = new Sticker(ap); //准备贴膜组件
    aps.Print();
 
    Decorator apa = new Accessories(ap); //过了几天新增了挂件组件
    apa.Print();
 
    Sticker s = new Sticker(ap);    //准备贴膜组件
    Accessories a = new Accessories(s);//同时准备挂件
    a.Print();
  }
}
登入後複製
(1)抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加責任的對象。       >這裡有Phone介面

(2)具體構件(Concrete Component)角色:定義一個將要接收附加責任的類別。                   >這裡指的ApplePhone

(3)裝飾(Decorator)角色:持有一個構件(Component)物件的實例,並實現一個與抽象構件介面一致的介面。 >指的Decorator

(4)具體裝飾(Concrete Decorator)角色:負責為構件物件添加上附加的責任。                   >指的是Accessories和Sticker

優點:

1. Decorator模式與繼承關係的目的功能都是要擴展對象的優點:

1. Decorator模式與繼承關係的功能,但是要擴展對象的功能,但是Decorator。

2. 透過使用不同的特定裝飾類別以及這些裝飾類別的排列組合,設計師可以創造出許多不同行為的組合。

缺點:

1. 這種比繼承更有彈性機動的特性,也同時意味著更多的複雜性。

2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很複雜。

3. 裝飾模式是針對抽像元件(Component)類型程式設計。但是,如果你要針對特定元件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行為,實現「半透明」的裝飾者模式。在實際項目中要做出最佳選擇。


以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板