这次来说说Strategy 策略模式,Strategy 策略模式在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。 我们先来看看Strategy 策略模式的基本代码。
//抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为[/size]
[size=16px]
[/size]
[size=16px] abstract class Strategy[/size]
[size=16px] {[/size]
[size=16px] abstract public void AlgorithmInterface();[/size]
[size=16px] }[/size]
[size=16px]
[/size]
[size=16px]
[/size]
[size=16px] class ConcreteStrategyA : Strategy[/size]
[size=16px] {[/size]
[size=16px] public override void AlgorithmInterface()[/size]
[size=16px] {[/size]
[size=16px] Console.WriteLine("算法接口实例A");[/size]
[size=16px] }[/size]
[size=16px] }[/size]
[size=16px]
[/size]
[size=16px] class ConcreteStrategyB: Strategy[/size]
[size=16px] {[/size]
[size=16px] public override void AlgorithmInterface()[/size]
[size=16px] {[/size]
[size=16px] Console.WriteLine("算法接口实例B");[/size]
[size=16px] }[/size]
[size=16px] }[/size]
[size=16px]
[/size]
[size=16px] class ConcreteStrategyC : Strategy[/size]
[size=16px] {[/size]
[size=16px] public override void AlgorithmInterface()[/size]
[size=16px] {[/size]
[size=16px] Console.WriteLine("算法接口实例C");[/size]
[size=16px] }[/size]
[size=16px] }[/size]
[size=16px]
[/size]
[size=16px]
[/size]
[size=16px] class Context[/size]
[size=16px] {[/size]
[size=16px] Strategy strategy;[/size]
[size=16px]
[/size]
[size=16px] public Context(Strategy strategy)[/size]
[size=16px] {[/size]
[size=16px] this.strategy = strategy;[/size]
[size=16px] }[/size]
[size=16px]
[/size]
[size=16px] public void ContextInterface()[/size]
[size=16px] {[/size]
[size=16px] strategy.AlgorithmInterface();[/size]
[size=16px] }[/size]
[size=16px] }[/size]
[size=16px]
首先写一个虚拟的策略类Strategy,里面有一个虚拟方法AlgorithmInterface,然后再写3个实体策略类ConcreteStrategyA,B,C 都继承父类
Strategy,
然后重写
AlgorithmInterface方法,各自输出各自的策略方法,最后在写一个
Context内容类,里面包含有一个策略类的引用,ContextInterface方法用来调用自己引用的策略方法AlgorithmInterface() , 现在再来看看实现方法:
Context c1=new Context(new ConcreteStrategyA());
c1.ContextInterface();
Context c2 = new Context(new ConcreteStrategyB());
c2.ContextInterface();
Context c3 = new Context(new ConcreteStrategyC());
c3.ContextInterface();
![](http://img.manew.com/data/attachment/forum/201612/12/170154ntqeq5xpiewouzso.jpg.thumb.jpg)
public interface IWeapons
{
void Play();
}
public class rifleWeapons : IWeapons
{
public void Play()
{
Console.WriteLine("使用步枪攻击远距离敌人");
}
}
public class pistolWeapons : IWeapons
{
public void Play()
{
Console.WriteLine("使用手枪攻击中距离敌人");
}
}
public class knifeWeapons : IWeapons
{
public void Play()
{
Console.WriteLine("使用刀子攻击远距离敌人");
}
}
public class grenadesWeapons : IWeapons
{
public void Play()
{
Console.WriteLine("使用猴赛雷砸敌人");
}
}
public class Player
{
private IWeapons weapons;
public void SetWeapons(IWeapons w)
{
weapons = w;
}
public void Play()
{
weapons.Play();
}
}
首先我们先声明一个武器接口类IWeapons 里面有一个Play方法 然后在写4个子类,就是我们上面说的4种武器,rifleWeapons 主武器类,pistolWeapons副武器类,
knifeWeapons 小刀类,grenadesWeapons 手雷类,分别继承IWeapons并重写Play方法,输出自己的作用。然后是我们的Player类,里面管理我们的武器接口,
有个Play方法运行武器的Play方法。
最后来实现 :
IWeapons weapons = null;
Player player=new Player();
Console.WriteLine("---玩家发现远距离敌人---");
weapons=new rifleWeapons();
player.SetWeapons(weapons);
player.Play();
Console.WriteLine("---玩家发现中距离敌人---");
weapons = new pistolWeapons();
player.SetWeapons(weapons);
player.Play();
Console.WriteLine("---玩家发现近距离敌人---");
weapons = new knifeWeapons();
player.SetWeapons(weapons);
player.Play();
Console.WriteLine("---玩家发现敌人躲起来了---");
weapons = new grenadesWeapons();
player.SetWeapons(weapons);
player.Play();
![](http://img.manew.com/data/attachment/forum/201612/12/171232k196ss6iz6g6xglt.jpg.thumb.jpg)
策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。2)
策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。