mik*_*dev 7 c# design-patterns decorator
我正在开发一款角色扮演游戏,用于娱乐和练习设计模式.我希望玩家能够将自己变成不同的动物.例如,德鲁伊可能会变成猎豹.现在我正计划使用装饰模式来做这个,但我的问题是 - 我怎么做到这样当德鲁伊处于猎豹形态时,他们只能获得猎豹的技能?换句话说,他们不应该能够获得他们正常的德鲁伊技能.
使用装饰模式看来,即使在猎豹形态下,我的德鲁伊也能够获得他们正常的德鲁伊技能.
class Druid : Character
{
// many cool druid skills and spells
void LightHeal(Character target) { }
}
abstract class CharacterDecorator : Character
{
Character DecoratedCharacter;
}
class CheetahForm : CharacterDecorator
{
Character DecoratedCharacter;
public CheetahForm(Character decoratedCharacter)
{
DecoratedCharacter= decoratedCharacter;
}
// many cool cheetah related skills
void CheetahRun()
{
// let player move very fast
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用这些类
Druid myDruid = new Druid();
myDruid.LightHeal(myDruid); // casting light heal here is fine
myDruid = new CheetahForm(myDruid);
myDruid.LightHeal(myDruid); // casting here should not be allowed
Run Code Online (Sandbox Code Playgroud)
嗯...现在我想起来了,Druid除非班级被降级,否则myDruid会不会给我们类咒语/技能?但即使是这种情况,是否有更好的方法可以确保myDruid此时被锁定在所有Druid相关的法术/技能之前,直到它被强制转换为Druid(因为目前它已经存在CheetahForm)
wil*_*ood 10
你不应该把你的咒语和技能作为课堂上的方法.它们应该是Spell和Skill对象的集合,可以通过Character(或可能是Creature)界面访问它们.然后,您的CheetaForm可以覆盖getSkills getSpells方法,以返回适当技能的新修改集合.