Kill()
、パラメーターなしで、忍者に自殺を命じているようです。Ninja
私は他の忍者に行動することを定義します:
public interface INinja
{
void KillBrutally(INinja otherNinja);
void KillHonorably(INinja otherNinja);
}
次に、武器からキル ムーブまでの抽象化のレベルを上げます。
public interface IKillMove
{
void Kill(INinja ninja);
}
忍者にキルタイプをサポートさせます:
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
}
これで、武器について心配することができます。
public interface IWeapon
{
void Attack(INinja ninja);
void Finish(INinja ninja);
}
そしてキルムーブ:
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
}
配線の例を次に示します (必要に応じて IoC コンテナーに変換します)。
var sword = new Sword();
var ninja = new Ninja(
new MoveInKillMove(sword, new Shuriken()),
new FinishingMove(sword));