Headfirst设计模式的C++实现——策略模式(Strategy)
前言
最近在学习《Headfirst设计模式》,里面的例子都是Java的。但是我对Java并不熟悉,所以试着用C++来实现书中的例子。
先来看看Duck以及子类
Duck.h
- #include <iostream>
- #include "FlyBehavior.h"
- class Duck
- {
- private:
- FlyBehavior *m_p_fly_behavior;
- public:
- virtual void quack() { std::cout << "--quack--" << std::endl; }
- virtual void swim() { std::cout << "--swim--" << std::endl; }
- virtual void display() { std::cout << "--duck--" << std::endl; }
- virtual void fly() { if ( m_p_fly_behavior) { m_p_fly_behavior->fly(); } };
- void set_fly_behavior( FlyBehavior *p_fly_behavior) { m_p_fly_behavior = p_fly_behavior; }
- Duck() : m_p_fly_behavior(NULL) {}
- virtual ~Duck() { if (m_p_fly_behavior) { delete m_p_fly_behavior; } }
- };
MallardDuck.h
- #include "Duck.h"
- #include "FlyWithWings.h"
- class MallardDuck : public Duck
- {
- public:
- void display() { std::cout << "--MallardDuck--" << std::endl; }
- MallardDuck() { set_fly_behavior( new FlyWithWings() ); }
- };
RedheadDuck.h
- #include "FlyWithWings.h"
- class RedheadDuck : public Duck
- {
- public:
- void display() { std::cout << "--RedheadDuck--" << std::endl; }
- RedheadDuck() { set_fly_behavior( new FlyWithWings() ); }
- };
RubberDuck.h
- #include "FlyNoWay.h"
- class RubberDuck : public Duck
- {
- public:
- void display() { std::cout << "--RubberDuck--" << std::endl; }
- void quack() { std::cout << "--squeak--" << std::endl; }
- RubberDuck() { set_fly_behavior( new FlyNoWay() ); }
- };
再来看看FlyBehavior类及其子类
FlyBehavior.h
- #include <iostream>
- class FlyBehavior
- {
- public:
- virtual void fly() {};
- virtual ~FlyBehavior() {};
- };
FlyWithWings.h
- #include "FlyBehavior.h"
- class FlyWithWings : public FlyBehavior
- {
- public:
- void fly () { std::cout << "--fly with wings--" << std::endl; }
- };
FlyNoWay.h
- #include "FlyBehavior.h"
- class FlyNoWay : public FlyBehavior
- {
- public:
- void fly() { std::cout << "--can not fly--" << std::endl; }
- };
最后是主函数
main.cpp
- #include "MallardDuck.h"
- #include "RedheadDuck.h"
- #include "RubberDuck.h"
- #include <vector>
- void test()
- {
- std::vector<Duck *> p_ducks;
- p_ducks.push_back( new MallardDuck() );
- p_ducks.push_back( new RedheadDuck() );
- p_ducks.push_back( new RubberDuck() );
- for (std::vector<Duck *>::iterator it = p_ducks.begin(); it < p_ducks.end(); it ++)
- {
- std::cout << std::endl;
- (*it)->display();
- (*it)->quack();
- (*it)->swim();
- (*it)->fly();
- delete (*it);
- }
- }
- int main()
- {
- while (true)
- {
- test();
- }
- }
稍作解释
main函数中死循环的调用test函数的意图是测试以上实现有没有内存泄露。
Headfirst设计模式的C++实现——策略模式(Strategy)的更多相关文章
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 设计模式(二)策略模式(Strategy)
1.分析项目中变化部分与不变部分 2.多用组合,少用继承:用行为类组合,而不是行为的继承 案例: 第一步,把行为抽象为接口 package top.littlepage.designPattern.S ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]
1 2{<HeadFirst设计模式>之策略模式 } 3{ 本单元中的类为策略类 } 4{ 编译工具: Delphi7.0 } 5{ E- ...
- 【HeadFirst 设计模式总结】1.策略模式
1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...
- headfirst设计模式(1)—策略模式
什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...
- 设计模式(二) 策略模式Strategy
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身 ...
- HeadFirst设计模式读书笔记之策略模式
1. 例子 1. 做一个鸭子模拟器,里面有很多不同的鸭子,有的可以游泳,有的可以睡觉,有的可以呱呱叫,一般套路是定义一个鸭子的超类,在 超类里定义睡觉,游泳,呱呱叫的方法,再让不同的鸭子子类继承这个超 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
随机推荐
- Trie 树 及Java实现
来源于英文“retrieval”. Trie树就是字符树,其核心思想就是空间换时间. 举个简单的例子. 给你100000个长度不超过10的单词.对于每一个单词,我们要判断他出没出现过,如果出现 ...
- MySQL--索引条件下推优化
http://blog.163.com/li_hx/blog/static/1839914132015782821512/ 一 什么是“索引条件下推” “索引条件下推”,称为 Index Condit ...
- 深入理解 CSS 中的行高与基线
1.基本概念 1. 基线.底线.顶线.中线 注意:基线(base line)并不是汉字文字的下端沿,而是英文字母“x”的下端沿. 2. 内容区 内容区是指底线和顶线包裹的区域(行内元素display ...
- Android概览
1.1 Android的开发缘由 早起的移动电话单单只具有手机的功能,并没有追求更多的追求功能和游戏娱乐.而在诺基亚提供的“贪吃蛇”游戏集成获得巨大成功的时候,手机制造商们才意识到手机 ...
- 【Shell脚本学习7】Shell脚本学习指南分享
http://yunpan.cn/cyARvNiaiLhfR (提取码:2878)
- Android小项目之三 splash界面
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- 浅谈C#中ref与out的区别
在C#这门高级语言中,你是否注意过ref与out的用法?你是否为在调用方法时需要多个返回值呢?不用急,接下来,我们去一起去研究一下这个问题... 其实呢,C#语言中,参数的传递一共有两种方法,值传递和 ...
- 使用app loader上传iOS应用
正如上篇文章中提到的,因为一些原因我尝试通过app loader打包上传应用到appStore 其实这个使用还是挺简单 的 首先要知道怎么打开loader 打开方式有两种 一种是直接打开loade ...
- 页面 Backspace 功能禁锢
var flag=false; window.document.onkeydown = function keyDown() { if(event.keyCode==8){ event.returnV ...
- VMware系统运维(四)SQL Server 2008 R2 新建数据库与ODBC数据
1.新建数据库,右击"新建数据库-." 2.设置数据库名,初始数据库大小,如果要配置数据库优化,可以考虑初始大小与日志大小,点击添加安装完成,即完成数据库新建. 3.ODBC数据源 ...