文档章节

【设计模式】策略模式

cuihao
 cuihao
发布于 2014/12/01 15:06
字数 614
阅读 4
收藏 0

 

 策略模式

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

  

/************************************************************************
设计模式2 策略模式 我们知道,一个公司里有若干个工种,每个工种做的工作是不同的,每种不同的工作 就可以看作是一个一个的策略(算法),以此为例来描述策略模式。 本文中有一个抽象基类【干活】类,三个子类【软件开发】、【市场拓展】 【数据处理】,每个子类代表一种操作,一种算法,几种策略 有一个用来管理各种策略的【TodoContext】上下文类,在此类中获取输入的策略的 实际动态类型,在此类对外提给客户的接口中调用了该抽象基类(指针),去调用 其虚函数完成操作。 ************************************************************************/

 

 

//【干活】抽象基类
class CDoSomething { public: CDoSomething(); virtual void DoSomething() const = 0; virtual ~CDoSomething(); }; CDoSomething::CDoSomething(){} void CDoSomething::DoSomething()  const { //do nothing
} CDoSomething::~CDoSomething()

 

 

//【软件开发】类
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(){}

 

 

//【市场拓展】类
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(){}

 

 

//【数据处理】 类
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(){}

 

 

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

//【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; }

 

main函数及执行结果如下

 

 

 

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

  

 

 

© 著作权归作者所有

cuihao

cuihao

粉丝 10
博文 103
码字总数 106528
作品 0
海淀
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.5K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
182
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

手写RPC框架指北另送贴心注释代码一套

Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的。所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架。 完整代码...

全菜工程师小辉
6分钟前
0
0
【Java】开发收货

简介 谨以此篇,记载开发过程中的一些tips。 编译器 【Shift + F6】可实现变量的联动修改。

Areya
22分钟前
2
0
DOM官方定义

DOM Document Object Model 文档对象模型 DOM的官方定义:W3C的DOM,可以使程序或者脚本(JS或AS\JScript),动态的访问或者操作文档的内容、结构、样式。 DOM只是一个标准,操作网页的标准。...

前端老手
28分钟前
4
0
IT兄弟连 HTML5教程 HTML5的学习线路图 第一阶段学习网页制作

学习HTML5技术可并不是简单学会几个新增的标签而已,HTML5现在可以说是前端所有技术的代名词。需要学习的语言和工具不仅多,对于刚接触他们的新人会感觉很乱。另外,前端开发也会细分很多个开...

老码农的一亩三分地
29分钟前
4
0
可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部