Kill()
, sans paramètre, semble que vous commandons le ninja à se suicider.Je définirais Ninja
d'agir sur d'autres ninjas:
public interface INinja
{
void KillBrutally(INinja otherNinja);
void KillHonorably(INinja otherNinja);
}
Ensuite, élever le niveau d'abstraction de l'arme pour tuer mouvement:
public interface IKillMove
{
void Kill(INinja ninja);
}
et ont des ninjas en charge les types de kill:
public sealed class Ninja : INinja
{
private readonly IKillMove _brutalKillMove;
private readonly IKillMove _honorableKillMove;
public Ninja(IKillMove brutalKillMove, IKillMove honorableKillMove)
{
_brutalKillMove = brutalKillMove;
_honorableKillMove = honorableKillMove;
}
#region INinja
public void KillBrutally(INinja otherNinja)
{
_brutalKillMove.Kill(otherNinja);
}
public void KillHonorably(INinja otherNinja)
{
_honorableKillMove.Kill(otherNinja);
}
#endregion
}
Maintenant, nous pouvons nous soucier des armes:
public interface IWeapon
{
void Attack(INinja ninja);
void Finish(INinja ninja);
}
et tuer mouvements:
public sealed class MoveInKillMove : IKillMove
{
private readonly IWeapon _shortRangeWeapon;
private readonly IWeapon _longRangeWeapon;
public MoveInKillMove(IWeapon shortRangeWeapon, IWeapon longRangeWeapon)
{
_shortRangeWeapon = shortRangeWeapon;
_longRangeWeapon = longRangeWeapon;
}
#region IKillMove
public void Kill(INinja ninja)
{
_longRangeWeapon.Attack(ninja);
_longRangeWeapon.Attack(ninja);
_longRangeWeapon.Attack(ninja);
_shortRangeWeapon.Finish(ninja);
}
#endregion
}
public sealed class FinishingMove : IKillMove
{
private readonly IWeapon _weapon;
public FinishingMove(IWeapon weapon)
{
_weapon = weapon;
}
#region IKillMove
public void Kill(INinja ninja)
{
_weapon.Finish(ninja);
}
#endregion
}
Voici un câblage de l'échantillon (Traduisez à votre conteneur IoC si nécessaire):
var sword = new Sword();
var ninja = new Ninja(
new MoveInKillMove(sword, new Shuriken()),
new FinishingMove(sword));
Quelle IoC utilisez-vous? –
Votre ninja n'aurait-il pas besoin d'un ISword et d'un IShuriken injecté? Je ne comprends pas pourquoi vous avez seulement fait une dépendance pour IWeapon. –
@Phil Sandler: Je pense aux lignes qu'un ninja devrait être armé d'une arme ... s'il veut être armé d'une épée ou d'un shuriken ... devrait être décidé plus tard ... je ne sais pas si je pense bien – Perpetualcoder