天天看點

模式執行個體之——裝飾執行個體

場景:遊戲修改器

描述:角色的級别太低,技能也弱,但關卡難度太大。往往一上來來不及回血,或遊戲設定回血太慢。這裡用遊戲修改器。

(一)角色

public abstract class Role

    {

        public string Name { get; set; }

        public int MP { get; set; }

        public int HP { get; set; }

        public abstract void RestoreMP();

        public abstract void RestoreHP();

}

系統預設的回藍系統RestoreMP,回血系統RestoreHP

(二)法師角色

public class Mage:Role

        public override void RestoreMP()

        {

            Console.WriteLine("每秒回複10點MP");

        }

        public override void RestoreHP()

            Console.WriteLine("每秒回複20點MP");

    }

正常情況下,每秒回複藍10點,血20點。

(三)裝飾

public abstract class Decorator : Role

        Role _role;

        public Decorator() { }

        public Decorator(Role role) { _role = role; }

            _role.RestoreMP();

            _role.RestoreHP();

(四)Mp修改

/// <summary>

    /// mp恢複修改

    /// </summary>

    public class PlugInForMP : Decorator

        public PlugInForMP()

        { }

        public PlugInForMP(Role role):base(role)

            Console.WriteLine("修改遊戲:每秒回複100點MP");

            //base.RestoreMP();

(五)Hp恢複

    /// hp恢複修改

    public class PlugInForHP : Decorator

        public PlugInForHP(Role role)

            : base(role)

        {

            Console.WriteLine("修改遊戲:每秒回複500點HP");

            //base.RestoreHP();

(六)測試

public void TestDecorator()

            //法師角色

            Role role = new Mage();

            //正常情況下

            role.RestoreHP();

            role.RestoreMP();

            //角色啟用回藍修改

            Decorator mp = new PlugInForMP(role);

            mp.RestoreMP();

            //角色啟用回血修改

            Decorator hp = new PlugInForHP(mp);

            hp.RestoreHP();

結果:

每秒回複20點MP

每秒回複10點MP

啟用遊戲修改之後……

修改遊戲:每秒回複100點MP

修改遊戲:每秒回複500點HP

如何使“對象功能的擴充”能夠根據需要來動态地實作?同時避免“擴充功能的增多”帶來的子類膨脹問題?進而使得任何“功能擴充變化”所導緻的影響将為最低?

動态地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。《設計模式》GOF

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園

繼續閱讀