定义
定义一组算法,并封装每个算法,让他们可以彼此交换使用。策略模式让这些算法在客户端使用它们能更加独立。
组成部分
Strategy(策略接口类)
提供“策略客户端”可以使用的方法
ConcreteStretegyA-ConcreteStretegyC(策略实现类)
不同算法的实现
Context(策略客户端)
拥有一个Strategy类的对象引用,并通过对象引用获取想要的计算结果。
游戏应用
在设计植物大战僵尸的植物攻击时,豌豆射手攻击时候可以分为普通子弹攻击,火焰子弹攻击,而这些攻击的伤害却是不同的。
Strategy
public abstract class BulletStrategy
{
//获取伤害
public abstract int GetAttackValue();
}
ConcreteStretegy
//普通子弹
public class ConcreteStretegyA : BulletStrategy
{
public override int GetAttackValue()
{
return 1;
}
}
//火焰子弹
public class ConcreteStretegyB : BulletStrategy
{
public override int GetAttackValue()
{
return 2;
}
}
Context
public class BulletContext
{
public BulletStrategy bulletStrategy;
public void SetBulletStrategy(BulletStrategy bulletStrategy)
{
this.bulletStrategy = bulletStrategy;
}
public int GetAttackValue()
{
return bulletStrategy.GetAttackValue();
}
}
优缺点
将复杂的公式计算从客户端中独立出来成为一个群组,之后客户端可以按照情况来决定使用的计算公式策略,提高系统的灵活纯度,也强化系统对所有计算策略的维护方式。这个和之前提的状态模式有些相同,不过状态是在一组状态中切换状态,状态之间由对应和链接的关系,strategy是一群没有任何关系的类所组成,不知彼此的存在。