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.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
随机推荐
- 入门之--linux配置php
[下载php源码]:从php的官方网站下载php的安装源码包. [解压安装包]:下载的安装包是经过压缩的gz格式,在linux可以使用自带的工具tar进行解压,在安装包所在目录执行命令:tar -zx ...
- Linux编程之《看门狗进程》
Intro 当我们编写服务器代码时,为了让自己的服务器在意外崩溃时能够及时的重启,软件看门狗就显示出它的作用了,该看门狗进程是通过fork一个子进程(业务进程),父进程一旦捕获到了子进程的结束信号就重 ...
- 【Mood-17】 github中在本地进行上传的时候出现ERROR: Repository not found. fatal: The remote end hung up unexpectedly
一开始出现这个错误的时候还感觉很奇怪,我明明在在本地中相应的库文件夹命令中输入: vim ./git/config 将文件中的 [remote “origin"]部分去掉!
- 小黄豆CRM软件安装
小黄豆CRM软件(官方网址:http://www.xhdcrm.com,演示地址:http://demo.xhdcrm.com)是一款开源免费的客户关系管理系统,其客户跟进模块简单易用.安装环境是wi ...
- Java Script基础(四) BOM模型
一.BOM模型 BOM模型(Browser Object Model),也称为文档对象模型,它包含浏览器相关的属性和方法,例如操作,前进后退按钮,控制地址栏,关闭浏览器窗口,打开新窗口等等.它包含的对 ...
- PHP trim()函数的一些用法
string trim ( string $str [, string $charlist ] ) - 去除字符串首尾处的空白字符(或者其他字符) trim()函数当第二个参数为空时,默认去掉空格.制 ...
- java.util.concurrent.CountDownLatch
闭锁是一种同步工具类,可以延迟线程的进度直到闭锁到达终止状态. 闭锁的作用相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭的,任何线程都不能通过这扇门,当闭锁到达结束状态时,这扇门会打开并允许所 ...
- 怒刷DP之 HDU 1114
Piggy-Bank Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- hdu 3280 动态规划
思路:dp[i][j]表示区间i,j变为回文串最少的代价. #include<map> #include<set> #include<cmath> #include ...
- 转: Android官方培训课程中文版(v0.9.5)
转: https://segmentfault.com/a/1190000004279679 1. 胡凯 tx SNG的一个开发者. http://hukai.me/android-training- ...