常见设计模式的解析和实现(C++)之十六-Strategy模式

来源:互联网 发布:php正则表达式验证邮箱 编辑:程序博客网 时间:2024/05/16 09:54
作用:
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.

UML结构图:


解析:
简而言之一句话,Strategy模式是对算法的封装.处理一个问题的时候可能有多种算法,这些算法的接口(输入参数,输出参数等)都是一致的,那么可以考虑采用Strategy模式对这些算法进行封装,在基类中定义一个函数接口就可以了.

实现:
1)Strategy.h
/********************************************************************    created:    2006/08/06    filename:     Strategy.h    author:        李创                http://www.cppblog.com/converse/    purpose:    Strategy模式的演示代码*********************************************************************/#ifndef STRATEGY_H#define STRATEGY_Hclass Strategy;class Context{public:    Context(Strategy *pStrategy);    ~Context();    void ContextInterface();private:    Strategy* m_pStrategy;};class Strategy{public:    virtual ~Strategy(){}    virtual void AlgorithmInterface() = 0;};class ConcreateStrategyA    : public Strategy{public:    virtual ~ConcreateStrategyA(){}    virtual void AlgorithmInterface();};#endif
2)Strategy.cpp
/********************************************************************    created:    2006/08/06    filename:     Strategy.cpp    author:        李创                http://www.cppblog.com/converse/    purpose:    Strategy模式的演示代码*********************************************************************/#include <iostream>#include "Strategy.h"Context::Context(Strategy *pStrategy)    : m_pStrategy(pStrategy){}Context::~Context(){    delete m_pStrategy;    m_pStrategy = NULL;}void Context::ContextInterface(){    if (NULL != m_pStrategy)    {        m_pStrategy->AlgorithmInterface();    }}void ConcreateStrategyA::AlgorithmInterface(){    std::cout << "AlgorithmInterface Implemented by ConcreateStrategyA\n";}
3)Main.cpp
/********************************************************************    created:    2006/08/06    filename:     Main.cpp    author:        李创                http://www.cppblog.com/converse/    purpose:    Strategy模式的测试代码*********************************************************************/#include "Strategy.h"int main(){    Strategy* pStrategy = new ConcreateStrategyA();    Context*  pContext  = new Context(pStrategy);    pContext->ContextInterface();    delete pContext;    return 0;}