模式实例之——装饰实例

简介: 场景:游戏修改器   描述:角色的级别太低,技能也弱,但关卡难度太大。往往一上来来不及回血,或游戏设定回血太慢。这里用游戏修改器。   (一)角色 public abstract class Role     {         public string Name { get; se...

场景:游戏修改器

 

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

 

(一)角色

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

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
1天前
|
搜索推荐
如何在构造函数中为类的实例添加方法?
在实际开发中,要根据具体的场景和需求来选择合适的方式来为类的实例添加方法,以确保代码的可读性、可维护性和性能。
|
24天前
|
数据可视化 UED
AnimationController 类的使用场景
【10月更文挑战第18天】这些只是 `AnimationController`类的一部分使用场景,实际上它的应用范围非常广泛,可以根据具体的需求和创意来发挥其作用,为应用添加更多的活力和魅力。在使用 `AnimationController`时,需要结合其他动画组件和相关的动画逻辑来实现具体的动画效果,同时要注意合理控制动画的时长、速度和节奏,以确保动画效果的自然和流畅。
|
2月前
|
设计模式
|
JavaScript 前端开发
js对象的创建对象模式和继承模式(下)---继承模式
js对象的创建对象模式和继承模式(下)---继承模式
98 0
|
JavaScript 前端开发
js对象的创建对象模式和继承模式(上)---构建对象模式
js对象的创建对象模式和继承模式(上)---构建对象模式
133 0
|
应用服务中间件 Python
|
Python
Python编程:类的实例动态增加属性和方法
Python编程:类的实例动态增加属性和方法
145 0
类实例:烤地瓜
# 地瓜肯定不止一个,类,创建地瓜,烤的程序都一样 # 类:初始化 和 如何烤 # 初始化:状态L::生的 烤过的时间为0 加调料:没有 -- 将来芥末,番茄酱 [] # 烤动作:0-3:生的;3-5半生不熟;5-8熟了;大于了8烤糊了 class SweetPotao(object): def __init__(self): # 状态 self.
789 0
|
Python