[用設計模式鍛鍊C#系列]之Decorator (轉)

worldblog發表於2007-12-13
[用設計模式鍛鍊C#系列]之Decorator (轉)[@more@]

名稱:Decorator
中文名稱:裝飾
型別:結構型
簡介:我想當你真正的理解此時,
  你可能會像侯sir那樣,擊節而歌.
  暗歎精妙.好瀟灑的連環.當然這裡的
  精妙主要在語言的實現上.
  一般此模式,用於動態的給一個新增
  職責.向其它很多模式一樣,替代"純粹"的
  繼承物件體系的設計.注意這裡強調"純粹"
  也可說成是"靜態".因為decorator的實現
  很依賴繼承的特性.但它對於職責的新增是
  動態的,而不是透過預先設計大量的要求對
  象,以便需求.它架構物件的指導理念
  是透過小物件逐步"疊加"("作用")構成最終
  需求的大物件.
[]
宣告:這裡由於重在C#的鍛鍊.所以事例中不採用
  涉及連環,緊以簡單類示:

// created on -3-18 at 20:
//Environment Tool : shdevelop ....
// Member : component concretecomponent decorator  condecorator

  using System;

  abstract class Component
  {
 public abstract void Draw();  
  }

  class ConcreteComponent : Component
  {
 private string m_STR;
 public ConcreteComponent(string m_STRinparam)
 {
 m_STR = m_STRinparam; 
 }

 public overr void Draw()
 {
 Console.WriteLine
 ("I am concretecomponent.......n{0} ", m_STR);
 } 
  }

  class Decorator : Component
  {
 protected Component decoratoredobject;

 public void SetComponent(Component m_OBJinparam)
 {
 decoratoredobject = m_OBJinparam ;
 }
 public override void Draw()
 {
 if (decoratoredobject != null)
 decoratoredobject.Draw(); 
 }
  }

  class ConcreteDecorator : Decorator
  {
 private string strDecoratorName;
 public ConcreteDecorator (string m_STRinparam)
 {
 strDecoratorName = m_STRinparam;
 }
 public override void Draw()
 {
 CustomDecoration();
 base.Draw();
 }
 void CustomDecoration()
 {
 Console.WriteLine("In concretedecorator..........");
 Console.WriteLine("{0}", strDecoratorName);
 }
  }

  public class DesignPattern_Decorator_Test
  {
 public static void Main(string[] args)
 { 
 ConcreteComponent m_DECobj1 =
 new ConcreteComponent("I am the component which will be decorated........n");   

  ConcreteDecorator m_DECobj2 =
 new ConcreteDecorator("I will decorate the component..........");

 m_DECobj2.SetComponent(m_DECobj1); 
 
 Component result = m_DECobj2;
 result.Draw();
  }
  }

點評:1.這裡的abstract也是C#對抽象類的原生支援.
  這裡是不可使用interface的,因為需要"多重"的過載.
  2.在concretedecorator單一的情況下可以將decorator併入concretedecorator.
  2.小物件逐步構件大物件,很多情況下,適宜採用strategy.
  譬如component定義的介面太臃腫,那麼concretedecorator的
  負擔會太重.而採用小物件strategy,逐步實現大物件,負擔
  不會很重,而且strategy的優點亦可產生作用:透過小物件介面
  實現decorator多樣化.

---------------------------------------------------------------------
  宣告:本程式重在演示C#基本用法
  不考慮在實際環境中應用帶來
  其它問題的情況.
  如:多執行緒.
 系列文章宣告請見第一篇:
    [用設計模式鍛鍊C#基本功系列]之Singleton、Bridge 
---------------------------------------------------------------------


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992975/,如需轉載,請註明出處,否則將追究法律責任。

相關文章