前言

最近在学习《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)的更多相关文章

  1. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  2. 设计模式(二)策略模式(Strategy)

    1.分析项目中变化部分与不变部分 2.多用组合,少用继承:用行为类组合,而不是行为的继承 案例: 第一步,把行为抽象为接口 package top.littlepage.designPattern.S ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  4. 【HeadFirst 设计模式总结】1.策略模式

    1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...

  5. headfirst设计模式(1)—策略模式

    什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...

  6. 设计模式(二) 策略模式Strategy

    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身 ...

  7. HeadFirst设计模式读书笔记之策略模式

    1. 例子 1. 做一个鸭子模拟器,里面有很多不同的鸭子,有的可以游泳,有的可以睡觉,有的可以呱呱叫,一般套路是定义一个鸭子的超类,在 超类里定义睡觉,游泳,呱呱叫的方法,再让不同的鸭子子类继承这个超 ...

  8. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  9. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

随机推荐

  1. [原创]-IIS7.5优化,支持同时10万个请求

    背景:        IIS7.5是微软推出的最新平台IIS,性能也较以前有很大的提升,但是默认的设置配不适合很大的请求.但是我们可以根据实际的需要进行IIS调整,使其性能更佳,支持同时10万个请求. ...

  2. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 8.全局防护盲点的总结下篇

    0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,接上篇http://www ...

  3. 微信js获得签名signature

    服务器端: 1 获取微信js accessToken 备注:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 开发者需要进行妥善保存.access_ ...

  4. iOS- SQLite3的基本使用

    iOS- 简单说说iOS移动客户端SQLite3的基本使用  1.为什么要使用SQLite3?   •大量数据需要存储 •管理数据,存储数据   SQLite是一种关系型数据库(也是目前移动客户端的主 ...

  5. as3.0 [Embed]标签嵌入外部资源

    1.[Embed]嵌入资源 ActionScript代码的顺序非常重要.你必须在声明变量前添加[Embed]元数据标签,而且这个变量的类型会是Class; package { import flash ...

  6. 给力的轻量级JavaScript动画框架 - jsMorph

    jsMorph 是一个独立的轻量级 JavaScript 动画框架,可以用它来操纵多个 HTML 元素的样式,实现动画效果.此框架会自动检测起始位置.转换单位.调整渲染的速度,以此来获得更流畅的渲染体 ...

  7. 转: Android 后台任务型App多进程架构演化

    评注:android 后台分进程保活方式的实践 Android 后台任务型App多进程架构演化 字数1621 阅读2790 评论8 喜欢35 什么是后台任务型app 类似音乐.录音机,需要用户长时间在 ...

  8. 在ios7系统下,scrollView下移20像素

    从设备图库返回到scrollView时,scrollView会下移20像素,解决办法:self.edgesForExtendedLayout = UIRectEdgeNone; 如果加入此代码导致其他 ...

  9. Interesting Applications in Machine Learning and Computer Vision

    1.Visually Indicated Sounds 网址:http://vis.csail.mit.edu/ 通过视频预测敲打的声音 2.AI Porn Video Editor 代码网址:htt ...

  10. Centos下LAMP环境搭建

    CentOs下环境搭建.2015.04.15.0001 Author:周凯 Time: 2015.04.15 版本号:2015.04.15.0001 安装过程 安装apache yum install ...