设计模式 08 策略模式

发布于 2021-06-12  135 次阅读


一、意图

    定义一系列的算法,把他们一个个封装起来,并且使它们可互相替换。
    人话:我打开一个导航地图,导航功能可以根据需求选择不同模式(驾驶、骑行、步行)。

二、UML

图1
图1:策略模式UML

三、实例

    假设现在我们有一个导航系统,我们需要根据用户的选择使用不同的导航模式。我们选择User作为Context,将Navigator作为Strategy。

#include <iostream>

class Navigator
{
public:
    virtual void show() const = 0;
};

class User
{
private:
    Navigator* m_navi;
public:
    User(Navigator* p_navi = nullptr)
    {
        m_navi = p_navi;
    }

    void setNavi(Navigator* p_navi)
    {
        delete this->m_navi;
        this->m_navi = p_navi;
    }

    void showNaviMode()
    {
        this->m_navi->show();
    }
};

class WalkNavi : public Navigator
{
public:
    void show() const override
    {
        std::cout << "Walk Mode" << std::endl;
    }
};

class CycNavi : public Navigator
{
public:
    void show() const override
    {
        std::cout << "Cycling Mode" << std::endl;
    }
};

class DriveNavi : public Navigator
{
public:
    void show() const override
    {
        std::cout << "Drive Mode" << std::endl;
    }
};

void Client(User* user)
{
    user->showNaviMode();
}

int main()
{
    User* user = new User(new WalkNavi());
    Client(user);   // 步行模式
    user->setNavi(new CycNavi());
    Client(user);   // 骑行模式
    user->setNavi(new DriveNavi());
    Client(user);   // 驾驶模式

    delete user;
    return 0;
}