策略模式(Strategy Pattern)属于对象行为型模式,体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。策略模式的定义如下:
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。每一个算法封装到具有共同接口的独立的类中,策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;
策略模式中有三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2) 抽象策略对象:它可由接口或抽象类来实现。
(3) 具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
我们先用一个简单的例子开始. 一个实现游戏中的更换武器的场景。游戏中的每个角色配对一个武器。当然武器是可以随便更换的。。其中定义了角色的抽象,武器的抽象接口。
Heroes(角色)抽象类 定义了 角色名称属性, 武器接口,更换武器的函数,一个虚方法为更换武器的过程。
public abstract class Heroes
{
public string HeroesName;
protected IWeaponBehavior weapon;
public void setWeapon(IWeaponBehavior w) { this.weapon = w; }
public virtual void Fight()
{
throw new Exception(" this method should be Rwritten");
}
}
// 大法师
public class ArchMage : Heroes
{
public ArchMage()
{
this.HeroesName = "法师";
}
public override void Fight()
{
Console.Write(this.HeroesName);
this.weapon.useWeapoon();
}
}
通过以下步骤,开发人员可以很容易地在软件中实现策略模型:
1.对策略对象定义一个公共接口。
2.编写策略类,该类实现了上面的公共接口。
3.在使用策略对象的类中保存一个对策略对象的引用。
该武器为公告接口,具体的共有4种不同的武器(策略类 实现了公共接口) 其中都实现了各自武器的绘画..
// 武器接口
public interface IWeaponBehavior
{
void useWeapoon();
}
// 实现用宝剑挥舞
public class SwordBehavior : IWeaponBehavior
{
public void useWeapoon()
{
Console.Write(" 宝剑挥舞 ");
}
}
// 实现匕首刺杀
public class KnifeBehavior : IWeaponBehavior
{
public void useWeapoon()
{
Console.Write(" 匕首刺杀 ");
}
}
// 实现用弓箭刺杀
public class BowAndArrowBehavior : IWeaponBehavior
{
public void useWeapoon()
{
Console.Write(" 弓箭刺杀 ");