Я создаю ролевую игру для удовольствия и как опыт обучения. Я нахожусь в точке, где мой персонаж (волшебник) - заклинания. Я использую шаблон стратегии, чтобы установить заклинание, которое они собираются наложить, прежде чем произнести заклинание. Причина, по которой я пошел с этим подходом, состоит в том, что я хочу иметь возможность добавлять разные типы заклинаний позже, без необходимости связываться с классом/классом мастера.
Мой вопрос - - это плохой дизайн? Есть ли лучший/более чистый/простой подход для этого?
Я стараюсь держаться подальше от того, чтобы быть "тем парнем", который пытается сделать все, что вписывается в шаблон дизайна. Но в этом случае я чувствую себя прилично.
Вот как выглядит мой код с 2 заклинаниями
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 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
UPDATE: обновленный код с некоторыми предложениями из нижеприведенных ответов