实际问题
我们在解决问题的时候,需要分析问题属于什么类型,然后在脑中查找解决的办法。不同的问题有不同的解法。不同的东西有不同的应对策略。具体一点就是,微积分问题就使用微积分的解法,组合问题就使用组合问题的解法等等,我们要到达一个地方,近的话就走路,远的话就坐车,很远的话就坐飞机,一样的道理,不同问题所执行不同的策略。
策略模式
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性:
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
- 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
- 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。
结构:
执行过程:客户端调用Context类,然后Context类,类调用Stategy抽象类的具体子类,来实现其功能。
实例
在玩游戏的时候,面对不同的怪,我们可以采取不同的措施。
比如 近战 我们就使用近战技能
远程 我们就使用远程技能
看实例吧
技能抽象类
public abstract class AttackMode
{
public abstract void Attack();
}
近战技能
public class Slash : AttackMode
{
public override void Attack()
{
Console.WriteLine("使用技能:剑意挥砍");
}
}
远程技能
public class ElementBomb : AttackMode
{
public override void Attack()
{
Console.WriteLine("使用技能:魔力激流");
}
}
玩家类
public class Player
{
EnemyMode enemy;
public Player(EnemyMode enemy)
{
this.enemy = enemy;
}
public void Attack()
{
AttackMode attackMode = null;
switch (enemy)
{
case EnemyMode.Remote:
attackMode = new ElementBomb();
break;
case EnemyMode.Melee:
attackMode = new Slash();
break;
default:
break;
}
attackMode?.Attack();
}
}
敌人枚举
public enum EnemyMode
{
Remote,
Melee
}
调用端
class Program
{
static void Main()
{
Console.WriteLine("近战小兵来袭");
Player player1 = new Player(EnemyMode.Melee);
player1.Attack();
Console.WriteLine("");
Console.WriteLine("远程魔法师来袭");
Player player2 = new Player(EnemyMode.Remote);
player2.Attack();
}
}
结果
总结
策略模式就是将我们的各个算法进行分割,使后期维护方便,更容易进行管理。是一个十分常用的设计模式。
谢谢大家观看。