场景:游戏修改器
描述:角色的级别太低,技能也弱,但关卡难度太大。往往一上来来不及回血,或游戏设定回血太慢。这里用游戏修改器。
(一)角色
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; }
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("修改游戏:每秒回复100点MP");
//base.RestoreMP();
}
}
(五)Hp恢复
/// <summary>
/// hp恢复修改
/// </summary>
public class PlugInForHP : Decorator
{
public PlugInForHP(Role role)
: base(role)
{
}
public override void RestoreHP()
{
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