文章出處

概念:

裝飾者模式(Decorator Pattern): 動態地將功能添加到對象,相比生成子類更靈活,更富有彈性.

解決方案:

裝飾者模式的重點是對象的類型,裝飾者對象必須有著相同的接口,也就是有著相同的結構.這樣一來,在運行的過程中,就可以將這些對象融合在一起,將相同的屬性等成員有機的結合,就像生成另外一種類型一樣,而實際上,我們并不需要真的創建這個類型,它是動態生成的.這些裝飾者既可以組合,也可以撤銷組合,既回復到原來對象狀態.

示例介紹:

裝飾者模式的關鍵就是裝飾者類型的定義,而其中應包括組合操作的方法.

現在我們看一下裝飾者接口的定義:

    /// <summary>
    /// 裝飾者模式模型,接口
    /// </summary>
    public interface IDecorator
    {
        string Name { get; }
        int Sum { get; }
        void Add(IDecorator decorator);
    }
 
接下來是裝飾者類CDecorator類的定義:
    /// <summary>
    /// 裝飾者類
    /// </summary>
    public class CDecorator:IDecorator
    {
        private string myName;

        private int mySum;

        private ArrayList myDecorator;

        public CDecorator()
        {
            myName = "";
            mySum = 0;
            myDecorator = new ArrayList();
        }

        //只讀屬性,名稱
        public string Name
        {
            get
            {
                string result = myName;
                foreach (IDecorator d in myDecorator)
                {
                    result += ", " + d.Name;
                }
                return myName;
            }
        }

        //只讀屬性,合計值
        public int Sum
        {
            get
            {
                int result = mySum;
                foreach (IDecorator d in myDecorator)
                {
                    result += d.Sum;
                }
                return mySum;
            }
        }

        //添加裝飾者對象
        public void Add(IDecorator decorator)
        {
            myDecorator.Add(decorator);
        }
    }
 
下面我們通過代碼測試下這個模型:
    //應用測試
    class Program
    {
        static void Main(string[] args)
        {
            CDecorator decoratorA = new CDecorator("decoratorA", 1);
            CDecorator decoratorB = new CDecorator("decoratorB", 2);
            CDecorator decoratorC = new CDecorator("decoratorC", 3);
            
            decoratorA.Add(decoratorB);
            decoratorA.Add(decoratorC);

            Console.WriteLine(decoratorA.Name);
            Console.WriteLine(decoratorA.Sum);

            Console.Read();
        }
    }
運行結果如下:
QQ圖片20130907112029
 
 

應用特點

使用裝飾者模式時應注意以下特點:

  • 因裝飾者模式一般用于動態組合對象,所以,他們一般都是臨時性的,在這個模型中,我們并沒有添加取消組合功能.如果需要,你可以在IDecorator接口中添加Remove()方法,并在CDecorator類中實現它.
  • 不需要創建新的類型,就可以修改對象的特性(如對象的各種屬性值),從而影響了對象的行為,就像創建了一個新的對象類型一樣.
  • 需要創建很多的相同結構的裝飾者對象,以便于組合.

結束語

不要強硬的去理解設計模式,也不要強硬的去套用它的形式,你所要做的是理解它的技巧以及思想,慢慢體會你才會理解它的妙用,這是我的一點體會,希望大神多多拍磚.如果感覺不錯,請推薦****


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()