设计模式之策略模式(DesignPattern of Strategy)

策略模式:属于行为型模式,实现算法(策略接口)与行为(策略)的分离,根据不同的应用场景采取不同的策略来应对。基本构成有:场景类、策略接口以及N种不同的继承策略接口的具体子策略。
最经典的说法就是:当年周公瑾设计,孙权让刘玄德去东吴娶亲,临行,赵云陪同,诸葛亮交付他三个锦囊,用来应对危急情况。场景就是赵云在东吴遇到的不同危急情况,三个锦囊就是不同的具体子策略,而赵云自己就是那个策略接口,在不同情况下,赵云去打开不同的锦囊(虽然赵云是依次按顺序打开的锦囊,这里只是比方)。
下面通过Demo来说明策略模式:
首先整理下整体的框架:场景类(CScene)、策略接口(IStrategy)以及三个继承策略接口的具体子策略(Strategy1、Strategy2、Strategy3),最后加个主函数(Main)。对象的生成逻辑是:场景类根据不同的应用场景通过策略接口,生成不同的策略的场景对象。
代码:

// strategy.h
#ifndef STRATEGY_H
#define STRATEGY_H
class IStrategy
{
    public:
                IStrategy(){};
        virtual ~IStrategy(){};
        virtual void oper()=0;
}
#endif
// scene.h
#ifndef SCENE_H
#define SCENE_H
#include "strategy.h"
class CScene
{
    public:
        CScene(IStrategy* strategy);
        ~CScene();
        void DealWith();
    private:
        IStrategy* m_pStrategy;
}
#endif
// scene.cpp
#include "scene.h"
CScene::CScene(IStrategy* strategy)
{
    this->m_pStrategy = strategy;
}
CScene::~CScene()
{
    delete this->m_pStrategy;
}
void CScene::DealWith()
{
    this->m_pStrategy->oper();
}
// strategy1.h
#include "strategy.h"
class Strategy1 : public IStrategy
{
    public:
        Stratergy1(){};
        ~Strategy1(){};
        void oper();
}
// strategy1.cpp
#include"strategy1.h"
#include"iostream"
void Strategy1::oper()
{
    std::cout<<"This is Strategy1 !"<<std::endl;
}
/* strategy2.h与strategy2.cpp与上面一样,这里就不贴出代码了*/
// main.cpp
#include "strategy.h"
#include "strategy1.h"
#include "strategy2.h"
#include "scene.h"
#include <iostream>
using namespace std;
int main()
{
    CScene* demo1 = new CScene(new Strategy1());
    demo1->DealWith();
    delete demo1;
    demo1 = NULL;

    CScene* demo2 = new CScene(new Strategy2());
    demo2->DealWith();
    delete demo2;
    demo2 = NULL;

    return 0;
}
/* 结果这里就不贴出来了,大家自己运行下吧 */

策略模式算是所有设计模式中最简单的,策略模式的应用场景:实际生活中比如基本现在的软件都包含好几种语言版本,可以选择不同的版本,列如中文、英文等。我们通过配置软件的属性选择框(即上面CScene类构造函数的参数),来选择不同的语言(策略即上面的Strategy1、Strategy2等)。这里是我的个人理解,有误的地方还请各位指出。
所以这里策略模式的优缺点就很明显,用户可以通过选择不同的策略实现软件语言版本的切换,不需要知道这种行为实现的细节,但是用户需要知道所有的策略,才能选择自己想要的语言版本。
注:因为条件限制这里暂时贴出UML图,回头补上。

发布了12 篇原创文章 · 获赞 19 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u012675150/article/details/53399187