Я создаю ролевую игру для развлечения и обучения. Я нахожусь в точке, где мой персонаж (волшебник) использует заклинания. Я использую шаблон стратегии, чтобы установить заклинание, которое они собираются разыграть, перед тем, как читать заклинание. Причина, по которой я выбрал этот подход, заключается в том, что я хочу иметь возможность добавлять различные типы заклинаний в дальнейшем без необходимости возиться с классом персонажа / волшебника.
Мой вопрос - это плохой дизайн? Есть ли лучший / чище / проще подход для этого?
Я стараюсь держаться подальше от того "парня", который старается, чтобы все вписывалось в шаблон дизайна. Но в этом случае я чувствую, что это приличная подгонка.
Вот как выглядит мой код с двумя заклинаниями
public class Wizard : Creature
{
public List<Spell> Spells { get; set; }
public void Cast(Spell spell, Creature targetCreature)
{
spell.Cast(this, targetCreature);
}
}
public abstract class Spell
{
public string Name { get; set; }
public int ManaCost { get; set; }
public Spell(string name, int manaCost)
{
Name = name;
ManaCost = manaCost;
}
public void Cast(Creature caster, Creature targetCreature)
{
caster.SubtractMana(ManaCost);
ApplySpell(caster, targetCreature);
}
public abstract void ApplySpell(Creature caster, Creature targetCreature);
}
// increases the target's armor by 4
public class MageArmor : Spell
{
public MageArmor() : base("Mage Armor", 4);
public override void ApplySpell(caster, targetCreature)
{
targetCreature.AddAC(4);
}
}
// target takes 7 damage
public class FireBall : Spell
{
public FireBall() : base("Fire Ball", 5);
public override void ApplySpell(caster, targetCreature)
{
targetCreature.SubtractHealth(7);
}
}
Теперь, чтобы разыграть заклинание, мы делаем что-то вроде этого:
Wizard wizard = new Wizard();
wizard.Cast(new Spell.MageArmor(), wizard); // i am buffing myself
ОБНОВЛЕНИЕ: обновленный код с некоторыми предложениями из ответов ниже