追蹤
兔子也會的遊戲設計
關於部落格
一個推廣XNA與OGRE的園地,當然還有其他關於遊戲設計的主題,歡迎有興趣的同好交流指教
  • 104845

    累積人氣

  • 0

    今日人氣

    0

    追蹤人氣

裝飾者模式

//裝飾者模式
using System;

namespace Decorator
{
    ///
    /// 裝置者模式主要是包裹被裝飾者,可以用來將附加功能抽離
    ///
    ///
    //可以是抽象類別或是介面
    public abstract class Animation
    {
        public Animation()
        {

        }
        public virtual void Perform()
        {
        }
    }
    //裝飾者類別
    public abstract class Decorator : Animation
    {
        //有一個父類別的參考
        public Animation anim;
        //建構時 指向實體
        public Decorator(Animation a)
        {
            anim = a;
        }
        //整個範例的精隨 覆寫執行方法
        public override void Perform()
        {
            //會去呼叫指到實體的方法
            anim.Perform();
        }
    }
    //繼承動畫類別 假設這是要做2D動畫
    public class Animation2D : Animation
    {
        public Animation2D()
        { }
        //一樣覆寫執行方法
        public override void Perform()
        {
            Console.WriteLine("最後由我來畫圖n");
        }
    }
    //平移類別 繼承裝飾者類別
    public class Translate : Decorator
    {
        public Translate(Animation anim)
            : base(anim)
        { }
        //一樣覆寫執行方法
        public override void Perform()
        {
            Console.WriteLine("我作了平移n");
            //要注意的是這行 他會去呼叫Dector所指向實體的方法 也就是說會去呼叫上一層的執行方法 類似遞迴的作法
            base.Perform();
        }
    };
    //旋轉類別 繼承裝飾者類別
    public class Rotate : Decorator
    {
        public Rotate(Animation anim)
            : base(anim)
        { }
        //同平移
        public override void Perform()
        {
            Console.WriteLine("我作了旋轉n");
            base.Perform();
        }
    };
    //縮放類別 繼承裝飾者類別
    public class Scale : Decorator
    {
        public Scale(Animation anim)
            : base(anim)
        { }
        //同平移
        public override void Perform()
        {
            Console.WriteLine("我作了縮放n");
            base.Perform();
        }
    };

    class Client
    {
        ///
        /// 應用程式的主進入點。
        ///
        [STAThread]
        static void Pause()
        {
            Console.WriteLine("Press Enter To Continue....");
            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            //很簡單的應用 我生成了一個動畫物件 我打包了旋轉 縮放 平移 而且這個動畫物件是2D的
            //如此一來我就可以很方便的選取這個動畫需要哪些功能,就跟點菜一樣方便,不要的時候也可以抽離
            Animation anim = new Rotate(new Scale(new Translate(new Animation2D())));
            anim.Perform();
            Pause();
        }
    }
}

//建議您複製下來完整編譯執行看看會更了解。

相簿設定
標籤設定
相簿狀態