上图来自于Love667767的博客用图
(1)策略模式通常把一系列的算法(算法等于常说的类中的方法,在这里称之为算法)包装到一系列的策略类里面。用一句话慨括策略模式就是——“将每个算法封装到不同的策略类中,使得它们可以互换”。比如说在继承关系中,子类重写算法,这就实现互换,
(2)示例:现在有不同的角色和不同的武器,每个角色只能使用一个武器,但是可以在游戏中换武器。
实现:
Charactor(角色)是抽象类,是由具体的角色来继承,具体的角色有King,Queen,Knight,Troll(妖怪),Weapon(武器)是接口,由具体的武器继承,所有的角色和武器都是具体类,任何角色想要换武器,可以调用setWeapon()方法,在打斗(fight)中,会调用到目前武器的useWeapon()方法,攻击其他角色。
(3)可以根据上图编辑代码
角色:
public abstract class Character
{
WeaponBehavior weapon;//上图的UML图中这个类和WeaponBehavior有关联箭头,在这里进行关联。
//virtual表示可以被子类override
public virtual void fight()
{
Console.WriteLine("战斗!!!");
}
/// <summary>
/// 更换武器的方法。
/// </summary>
/// <param name="w"></param>
public virtual void setWeapon(WeaponBehavior w)
{
this.weapon = w;
}
}
国王:
public class King:Character
{
//继承父类的算法,可以不用在子类重复,要改变的话加override进行重写。
public void wq(WeaponBehavior w)
{
w.useWeapon();
}
public King()
{ }
}
武器接口:
public interface WeaponBehavior
{
void useWeapon();
}
铁剑与匕首实例:
public class SwordBehavior : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("使用铁剑");
}
}
public class KnifeBehavior : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("使用匕首");
}
}
测试类:
public class Test
{
public static void Main(String[] args)
{
WeaponBehavior wb = new SwordBehavior();
King c = new King();
c.fight();
//使用铁剑
c.wq(new SwordBehavior());
//使用匕首
c.wq(new KnifeBehavior());
}
}