C++设计模式--策略模式

策略模式(Strategy Pattern)

定义

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

         

  • Context(环境角色):持有一个对 Strategy 的引用,最终给客户端调用。
  • IStrategy(抽象策略):定义了一个公共接口,让不同的算法以不同的方式来实现。通过这个接口,Context 可以调用不同的算法。
  • ConcreteStrategy(具体策略):实现 Strategy 定义的接口,提供具体算法的实现。

 

常用场景

  • 多个类有不同的表现形式,每种表现形式可以独立成单独的算法。
  • 需要在不同情况下使用不同的算法,以后算法可能还会增加。
  • 对客户端隐藏具体算法的实现细节,彼此完全独立。

 

优缺点

优点:

  • 各自使用封装的算法,可以很容易地引入新的算法来满足相同的接口。
  • 由于实现的是同一个接口,所以策略之间可以自由切换。
  • Strategy 使客户端能够选择所需的算法,而无需使用 switch/case 或 if/else 语句。
  • 算法的细节完全封装在 Strategy 类中,因此,可以在不影响 Context 类的情况下更改算法的实现。


缺点:

  • 客户端必须知道所有的策略,了解它们之间的区别,以便适时选择恰当的算法。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
     

 

C++实现

举例:出行方式

在生活中,出行方式可以有步行、地铁、共享单车、自驾等等,每一种方式相当于一种策略方式,每个人根据自己的习惯和距离选择不同的出行方式。

类图:

                            
          

代码:
 

#include <iostream>

using std::cout;
using std::endl;

// 策略基类
class Strategy
{
public:
    Strategy() {}

    virtual ~Strategy() {}

    virtual void Travel() = 0;
};

// 步行
class WalkStrategy : public Strategy
{
public:
    void Travel()
    {
        std::cout << "I will travel on foot!" << std::endl;
    }
};

// 自驾
class DriveStrategy : public Strategy
{
public:
    void Travel()
    {
        std::cout << "I will realize self-driving travel!" << std::endl;
    }
};

// 火车
class TrainStrategy : public Strategy
{
public:
    void Travel()
    {
        std::cout << "I will travel by train!" << std::endl;
    }
};

class Tour
{
public:
    Tour(Strategy* strategy) : m_strategy(strategy) {}
    ~Tour() {}

    void Travel() {m_strategy->Travel();}

private:
    Strategy* m_strategy;
};

void StrategyTest()
{
    Strategy* pWalkStrategy = new WalkStrategy;
    Strategy* pDriveStrategy = new DriveStrategy;
    Strategy* pTrainStrategy = new TrainStrategy;

    Tour* pWalkTour = new Tour(pWalkStrategy);
    Tour* pDriveTour = new Tour(pDriveStrategy);
    Tour* pTrainTour = new Tour(pTrainStrategy);

    pWalkTour->Travel();
    pDriveTour->Travel();
    pTrainTour->Travel();

    delete pTrainTour;
    delete pDriveTour;
    delete pWalkTour;
    delete pWalkStrategy;
    delete pDriveStrategy;
    delete pTrainStrategy;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值