设计模式(七)--策略模式

本文介绍了策略模式的概念及其在软件设计中的应用。策略模式允许算法独立于使用它的客户端,并可以在运行时进行切换。文章通过一个简单的CS游戏人物武器切换的例子,展示了如何实现策略模式,并讨论了其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。


结构图

这里写图片描述


例子

这里用CS里的人物作为例子,每个人都可以有几个武器,武器之间动态切换,武器拥有统一的攻击命令。

//武器行为基类:
class WeaponBehavior
{
public:
    void virtual useWeapon() = 0;
};

//AK47类:
class AK47 : public WeaponBehavior
{
public:
    void useWeapon()
    {
        cout << "Use AK47" << endl;
    }
};

//Knife类
class Knife : public WeaponBehavior
{
public:
    void useWeapon()
    {
        cout << "Use Knife" << endl;
    }
};

//人物类:
class Character
{
public:
    void SetWeapon(WeaponBehavior *w)
    {
        this->weapon = w;
    }
    virtual void fight() = 0;
protected:
    WeaponBehavior *weapon;
};

//国王类:
class King : public Character
{
public:
    void fight()
    {
        weapon->useWeapon();
    }
}

//客户调用:
int main()
{
    WeaponBehavior *ak47 = new AK47();
    WeaponBehavior *knife = new Knife();
    Character *kin = new King();
    kin->fight();

    kin->SetWeapon(ak47);
    kin->fight();

    kin->SetWeapon(knife);
    kin->fight();
    return 0;
}

适用场景

  1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为
  2. 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现
  3. 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

优点

  • 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
  • 使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

缺点

  • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
  • 客户端必须知道所有的策略类,并自行选择使用哪一个策略类。这就意味着客户端必须理解这些算法区别,以便选择恰当的算法类。换句话说,策略模式只适用于客户端知道算法或者行为的情况。

对比

1.与状态模式
在解决的问题上,状态模式是解决内在状态的改变,而策略模式是解决内部算法的改变。在解决的方法上,状态模式是自我控制状态的改变,而策略模式是由外部制定使用使用啥策略。

2.与简单工厂模式
简单工厂模式是创建型模式,关注对象的创建。策略模式是行为型模式,关注行为的封装。简单工厂模式是根据不同的条件返回一个适合的类给你使用,然后调用者使用工厂类返回的类去完成相应的操作。而策略模式是必须首先创建一个想使用的类实例,然后实例被当作参数传递进去,既而通过该实例去调用不用的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。


特点

  • 简化了单元测试,因为每个算法都有自己单独的类,可以通过自己的接口进行单独测试
  • 消除条件语句,只要在封装过程中需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值