码迷,mamicode.com
首页 > 其他好文 > 详细

【设计模式】策略模式

时间:2014-05-13 21:57:35      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   c   

 

 策略模式

关于策略模式,我的理解:有若干个策略(算法),有一个管理策略的类,该类的输入为策略,输入为不同的策略(算法),输出为该种策略(算法)对应的类对象(的动态类型),然后程序员手动去使用该类对象(的动态类型)去调用相应虚函数,根据多态机制实现执行不同的操作。

  

bubuko.com,布布扣
/************************************************************************
设计模式2
策略模式

我们知道,一个公司里有若干个工种,每个工种做的工作是不同的,每种不同的工作
就可以看作是一个一个的策略(算法),以此为例来描述策略模式。

本文中有一个抽象基类【干活】类,三个子类【软件开发】、【市场拓展】
【数据处理】,每个子类代表一种操作,一种算法,几种策略

有一个用来管理各种策略的【TodoContext】上下文类,在此类中获取输入的策略的
实际动态类型,在此类对外提给客户的接口中调用了该抽象基类(指针),去调用
其虚函数完成操作。


************************************************************************/
bubuko.com,布布扣

 

 

bubuko.com,布布扣
//【干活】抽象基类
class CDoSomething
{
public:
    CDoSomething();
    virtual void DoSomething() const = 0; 
    virtual ~CDoSomething();
};

CDoSomething::CDoSomething(){}

void CDoSomething::DoSomething()  const
{
    //do nothing
}

CDoSomething::~CDoSomething()
bubuko.com,布布扣

 

 

bubuko.com,布布扣
//【软件开发】类
class CSoftDevelop : public CDoSomething
{
public: 
    CSoftDevelop();
    virtual void DoSomething() const;
    virtual ~CSoftDevelop();
};

CSoftDevelop::CSoftDevelop() {}

void CSoftDevelop::DoSomething() const
{
    cout << "\r\n研发部去写代码去,快去! 滚!\r\n";
}

CSoftDevelop::~CSoftDevelop(){}
bubuko.com,布布扣

 

 

bubuko.com,布布扣
//【市场拓展】类
class CBusinessDevelop : public CDoSomething
{
public: 
    CBusinessDevelop();
    virtual void DoSomething() const;
    virtual ~CBusinessDevelop();
};

CBusinessDevelop::CBusinessDevelop() {}

void CBusinessDevelop::DoSomething() const
{
    cout << "\r\n市场部的兄弟们,最近业绩怎么样啊?什么?那还不快滚去出差!滚!\r\n";
}

CBusinessDevelop::~CBusinessDevelop(){}
bubuko.com,布布扣

 

 

bubuko.com,布布扣
//【数据处理】 类
class CDataHandle : public CDoSomething
{
public:
    CDataHandle( );
    virtual void DoSomething() const;
    virtual ~CDataHandle();
};

CDataHandle::CDataHandle() {}

void CDataHandle::DoSomething() const
{
    cout << "\r\n数据处理部的,模型做完了吗? 什么?还差点? 还不快加班做! 滚!\r\n";
}

CDataHandle::~CDataHandle(){}
bubuko.com,布布扣

 

 

用来管理各种策略(算法,干什么活)的上下文类

bubuko.com,布布扣
//【ToDo上下文】类
class CTodoContext 
{
public:
    //构造函数的参数为一个【干活】类指针,即一个策略(算法,干什么活)
    CTodoContext(CDoSomething* ptr);
    void DoSomething();  //此函数非虚,和【干活】类及其子类没有关系

    virtual ~CTodoContext();

protected:
    CDoSomething* m_ptrDoSomething;
};

CTodoContext::CTodoContext(CDoSomething* ptr)
{
    m_ptrDoSomething = ptr;
}

void CTodoContext::DoSomething()
{
    if (NULL != m_ptrDoSomething) 
        m_ptrDoSomething->DoSomething(); 
}

CTodoContext::~CTodoContext()
{
    if(NULL != m_ptrDoSomething) delete m_ptrDoSomething;
}
bubuko.com,布布扣

 

main函数及执行结果如下

bubuko.com,布布扣

 

 

 

下一篇文章写写【策略模式】和【简单工厂模式】的结合

  

 

 

【设计模式】策略模式,布布扣,bubuko.com

【设计模式】策略模式

标签:style   blog   class   code   java   c   

原文地址:http://www.cnblogs.com/cuish/p/3724044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!