前言

最近在学习《Headfirst设计模式》,里面的例子都是Java的。但是我对Java并不熟悉,所以试着用C++来实现书中的例子。

先来看看Duck以及子类

Duck.h

 1 #include <iostream>
 2 #include "FlyBehavior.h"
 3
 4 class Duck
 5 {
 6 private:
 7     FlyBehavior *m_p_fly_behavior;
 8 public:
 9     virtual void quack() { std::cout << "--quack--" << std::endl; }
10     virtual void swim() { std::cout << "--swim--" << std::endl; }
11     virtual void display() { std::cout << "--duck--" << std::endl; }
12
13     virtual void fly() { if ( m_p_fly_behavior) { m_p_fly_behavior->fly(); } };
14     void set_fly_behavior( FlyBehavior *p_fly_behavior) { m_p_fly_behavior = p_fly_behavior; }
15
16     Duck() : m_p_fly_behavior(NULL) {}
17     virtual ~Duck() { if (m_p_fly_behavior) { delete m_p_fly_behavior; } }
18 };

MallardDuck.h

1 #include "Duck.h"
2 #include "FlyWithWings.h"
3
4 class MallardDuck : public Duck
5 {
6 public:
7     void display() { std::cout << "--MallardDuck--" << std::endl; }
8     MallardDuck() { set_fly_behavior( new FlyWithWings() ); }
9 };

RedheadDuck.h

1 #include "FlyWithWings.h"
2 class RedheadDuck : public Duck
3 {
4 public:
5     void display() { std::cout << "--RedheadDuck--" << std::endl; }
6     RedheadDuck() { set_fly_behavior( new FlyWithWings() ); }
7 };

RubberDuck.h

1 #include "FlyNoWay.h"
2
3 class RubberDuck : public Duck
4 {
5 public:
6     void display() { std::cout << "--RubberDuck--" << std::endl; }
7     void quack() { std::cout << "--squeak--" << std::endl; }
8     RubberDuck() { set_fly_behavior( new FlyNoWay() ); }
9 };

再来看看FlyBehavior类及其子类

FlyBehavior.h

1 #include <iostream>
2
3 class FlyBehavior
4 {
5 public:
6     virtual void fly() {};
7     virtual ~FlyBehavior() {};
8 };

FlyWithWings.h

1 #include "FlyBehavior.h"
2
3 class FlyWithWings : public FlyBehavior
4 {
5 public:
6     void fly () { std::cout << "--fly with wings--" << std::endl; }
7 };

FlyNoWay.h

1 #include "FlyBehavior.h"
2
3 class FlyNoWay : public FlyBehavior
4 {
5 public:
6     void fly() { std::cout << "--can not fly--" << std::endl; }
7 };

最后是主函数

main.cpp

 1 #include "MallardDuck.h"
 2 #include "RedheadDuck.h"
 3 #include "RubberDuck.h"
 4 #include <vector>
 5
 6 void test()
 7 {
 8     std::vector<Duck *> p_ducks;
 9     p_ducks.push_back( new MallardDuck() );
10     p_ducks.push_back( new RedheadDuck() );
11     p_ducks.push_back( new RubberDuck() );
12
13     for (std::vector<Duck *>::iterator it = p_ducks.begin(); it < p_ducks.end(); it ++)
14     {
15         std::cout << std::endl;
16         (*it)->display();
17         (*it)->quack();
18         (*it)->swim();
19         (*it)->fly();
20         delete (*it);
21     }
22 }
23
24 int main()
25 {
26     while (true)
27     {
28         test();
29     }
30 }

稍作解释

main函数中死循环的调用test函数的意图是测试以上实现有没有内存泄露。

转载于:https://www.cnblogs.com/ren-yu/p/4928809.html

Headfirst设计模式的C++实现——策略模式(Strategy)相关推荐

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

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

  2. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  3. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

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

  4. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  5. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

  6. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

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

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

  8. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  9. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

最新文章

  1. ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤
  2. Opengl编程学习笔记(五)——从FRAGMENT到PIXEL(framebuffer 帧缓存)
  3. Fix Missing Scripts
  4. 洛谷P1082 同余方程 数论
  5. python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...
  6. tkinter中text属性_python tkinter基本属性详解
  7. 减小Gcc编译程序的体积
  8. Silverlight 1.0 beta 和1.1 Alpha体验
  9. ASA 5520 ASDM 配置
  10. rk3288 android7.1.2 4g模块调试(四)
  11. 药品质量管理软件市场现状及未来发展趋势
  12. Ubuntu16.04拨号上网
  13. JAVA-day09-多线程
  14. error the @annotation pointcut expression is only supported at Java 5 compliance level or above
  15. 如何打造一个让人愉快的框架
  16. 一步步看α-β剪枝算法
  17. 微信电脑版只能扫码登录的原因,你一定想不到
  18. perror()函数
  19. C语言简单实现打字游戏,小霸王其乐无穷!
  20. 宁愿写两遍代码,也不用C++跨iOS、Android平台开发?

热门文章

  1. 【若依(ruoyi)】Bootstrap-Table的使用
  2. getset原子性 redis_Redis 分布式锁进化史解读 + 缺陷分析
  3. 支持三个cpu的服务器,基于第三代至强可扩展处理器,宁畅G40系列服务器正式发布...
  4. bootcss echarts_数据可视化插件使用(Echarts)
  5. android活动管理器,Android 中管理所有的 Acyivity 活动
  6. python逻辑题_这道逻辑题 用 Python 代码 如何实现?
  7. linux vbox 添加串口,如何在VirtualBox中直接使用本机物理串口
  8. qt 字体不随dpi_Windows – QT5字体渲染在各种平台上不同
  9. 计算机网络-思维导图(6)应用层
  10. 深入理解javascript原型和闭包(9)——简述【执行上下文】下