天天看點

設計模式---裝飾模式(DesignPattern_Decorator)

摘錄自:設計模式與遊戲完美開發
十年磨一劍,作者将設計模式理論巧妙地融入到實踐中,以一個遊戲的完整實作呈現設計模式的應用及經驗的傳承 《軒轅劍》之父——蔡明宏、資深遊戲制作人——李佳澤、Product Evangelist at Unity Technologies——Kelvin Lo、信仁軟體設計創辦人—— 賴信仁、資深3D遊戲美術——劉明恺 聯合推薦全書采用了整合式的項目教學,即以一個遊戲的範例來應用23種設計模式的實作貫穿全書,讓讀者學習到整個遊戲開發的全過程和作者想要傳承的經驗,并以淺顯易懂的比喻來解析難以了解的設計模式,讓想深入了解此領域的讀者更加容易上手。

工程GitHub

DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月夥食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上“最好的的禮物,就是愛你的Fita”,再到街上禮品店買了個像框,再找隔壁搞美術設計的Mike設計了一個漂亮的盒子裝起來……,我們都是Decorator,最終都在修飾我這個人呀,怎麼樣,看懂了嗎?

裝飾模式:裝飾模式以對用戶端透明的方式擴充對象的功能,是繼承關系的一個替代方案,提供比繼承更多的靈活性。動态給一個對象增加功能,這些功能可以再動态的撤消。增加由一些基本功能的排列組合而産生的非常大量的功能。

using UnityEngine;
using System.Collections;

namespace DesignPattern_Decorator
{
    // 動态增加組建的基類
    public abstract class Component
    {
        public abstract void Operator();
    }

    //執行個體元件
    public class ConcreteComponent : Component
    {
        public override void Operator()
        {
            Debug.Log("ConcreteComponent.Operator");
        }
    }

    // 持有指向Component的reference,須符合Component的介面
    public class Decorator : Component
    {
        Component m_Component;
        public Decorator(Component theComponent)
        {
            m_Component = theComponent;
        }

        public override void Operator()
        {
            m_Component.Operator();
        }
    }

    // 增加額外的功能A
    public class ConcreteDecoratorA : Decorator
    {
        Component m_Component;
        public ConcreteDecoratorA(Component theComponent) : base(theComponent)
        {
        }

        public override void Operator()
        {
            base.Operator();
            AddBehaivor();
        }

        private void AddBehaivor()
        {
            Debug.Log("ConcreteDecoratorA.AddBehaivor");
        }
    }

    // 增加額外的功能B
    public class ConcreteDecoratorB : Decorator
    {
        Component m_Component;
        public ConcreteDecoratorB(Component theComponent) : base(theComponent)
        {
        }

        public override void Operator()
        {
            base.Operator();
            AddBehaivor();
        }

        private void AddBehaivor()
        {
            Debug.Log("ConcreteDecoratorB.AddBehaivor");
        }
    }

}
           
using UnityEngine;
using System.Collections;
using DesignPattern_Decorator;
using DesignPattern_ShapeDecorator;

public class DecoratorTest : MonoBehaviour
{

    void Start()
    {
        //UnitTest_Shape();
        UnitTest();
    }

    // 
    void UnitTest()
    {

        // 物件
        ConcreteComponent theComponent = new ConcreteComponent();

        // 增加Decorator
        ConcreteDecoratorA theDecoratorA = new ConcreteDecoratorA(theComponent);
        theDecoratorA.Operator();

        ConcreteDecoratorB theDecoratorB = new ConcreteDecoratorB(theComponent);
        theDecoratorB.Operator();

        // 再增加一層
        ConcreteDecoratorB theDecoratorB2 = new ConcreteDecoratorB(theDecoratorA);
        theDecoratorB2.Operator();
    }
}
           

繼續閱讀