场景:游戏修改器

 

描述:角色的级别太低,技能也弱,但关卡难度太大。往往一上来来不及回血,或游戏设定回血太慢。这里用游戏修改器。

 

(一)角色

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("每秒回复10MP");

        }

 

        public override void RestoreHP()

        {

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

        }

    }

正常情况下,每秒回复蓝10点,血20点。

(三)装饰

public abstract class Decorator : Role

    {

        Role _role;

        public Decorator() { }

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

 

        public override void RestoreMP()

        {

            _role.RestoreMP();

        }

 

        public override void RestoreHP()

        {

            _role.RestoreHP();

        }

    }

(四)Mp修改

/// <summary>

    /// mp恢复修改

    /// </summary>

    public class PlugInForMP : Decorator

    {

        public PlugInForMP()

        { }

 

        public PlugInForMP(Role role):base(role)

        {

        

        }

        public override void RestoreMP()

        {

            Console.WriteLine("修改游戏:每秒回复100MP");

            //base.RestoreMP();

        }

    }

(五)Hp恢复

/// <summary>

    /// hp恢复修改

    /// </summary>

    public class PlugInForHP : Decorator

    {

        public PlugInForHP(Role role)

            : base(role)

        {

        

        }

 

        public override void RestoreHP()

        {

            Console.WriteLine("修改游戏:每秒回复500HP");

            //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();

        }

 

结果:

每秒回复20MP
每秒回复10MP
启用游戏修改之后……
修改游戏:每秒回复100MP
修改游戏:每秒回复500HP


如何使对象功能的扩展能够根据需要来动态地实现?同时避免扩展功能的增多带来的子类膨胀问题?从而使得任何功能扩展变化所导致的影响将为最低?
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。《设计模式》GOF

 

 

posted on 2009-12-07 14:14  梅桦  阅读(349)  评论(0编辑  收藏  举报