天天看点

模式实例之——装饰实例

场景:游戏修改器

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

(一)角色

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>

转载请注明:博客园

继续阅读