《Head First 设计模式》例子的C++实现(1 策略模式)
最近在学习设计模式,用的是 《Head First 设计模式》这本书。感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式。唯一有点不方便的地方是这本书的例子全都是用的 Java 来实现的。而我主要是用 C++。所以就动手将书上的代码用 C++ 来实现了一遍。
策略模式
这一章用的是个 Duck 的例子。C++ 没有 interface 的概念,都是用类来实现的。
我将各个策略都放到了 behavior.h 和 behavior.cpp 中。
//behavior.h
#ifndef BEHAVIOR_H
#define BEHAVIOR_H
class FlyBehavior
{
public:
FlyBehavior() {}
virtual void fly() = 0;
};
class QuackBehavior
{
public:
QuackBehavior() {}
virtual void quack() = 0;
};
class FlyWithWings: public FlyBehavior
{
public:
void fly() override;
};
class FlyNoWay: public FlyBehavior
{
public:
void fly() override;
};
class FlyRocketPowered: public FlyBehavior
{
public:
void fly() override;
};
class Quack: public QuackBehavior
{
public:
void quack() override;
};
class Squeak: public QuackBehavior
{
public:
void quack() override;
};
class MuteQuack: public QuackBehavior
{
public:
void quack() override;
};
#endif // BEHAVIOR_H
//behavior.cpp
#include "behavior.h"
#include <iostream>
using std::cout;
using std::endl;
void FlyWithWings::fly()
{
cout << "I am flying!" << endl;
}
void FlyNoWay::fly()
{
cout << "I cannot fly!" << endl;
}
void FlyRocketPowered::fly()
{
cout << "I am fly with a rocket!" << endl;
}
void Quack::quack()
{
cout << "Quack" << endl;
}
void Squeak::quack()
{
cout << "Squeak" << endl;
}
void MuteQuack::quack()
{
cout << "<< Silence >>" << endl;
}
Duck 包含了两种 Behavior。Duck 本身设计为一个纯虚类,真实的各种鸭子都要从这里继承。
//duck.h
#ifndef DUCK_H
#define DUCK_H
#include "behavior.h"
class Duck
{
public:
Duck();
void performQuack();
void performFly();
virtual void display() = 0;
void setFlyBehavior(FlyBehavior * fb);
protected:
FlyBehavior *m_flyBehavior;
QuackBehavior *m_quackBehavior;
};
#endif // DUCK_H
//duck.cpp
#include "duck.h"
Duck::Duck()
{
}
void Duck::performQuack()
{
m_quackBehavior->quack();
}
void Duck::performFly()
{
m_flyBehavior->fly();
}
void Duck::setFlyBehavior(FlyBehavior * fb)
{
if(m_flyBehavior != nullptr)
{
delete m_flyBehavior;
}
m_flyBehavior = fb;
}
例子中有两种 Duck:
mallardduck.h
#ifndef MALLARDDUCK_H
#define MALLARDDUCK_H
#include "duck.h"
class MallardDuck : public Duck
{
public:
MallardDuck();
void display() override;
};
#endif // MALLARDDUCK_H
//mallardduck.cpp
#include "mallardduck.h"
#include <iostream>
using std::cout;
using std::endl;
MallardDuck::MallardDuck()
{
m_quackBehavior = new Quack;
m_flyBehavior = new FlyWithWings;
}
void MallardDuck::display()
{
cout << "I am a real Mallard Duck" << endl;
}
//modelduck.h
#ifndef MODELDUCK_H
#define MODELDUCK_H
#include "duck.h"
class ModelDuck : public Duck
{
public:
ModelDuck();
void display() override;
};
#endif // MODELDUCK_H
//modelduck.cpp
#include "modelduck.h"
#include <iostream>
using std::cout;
using std::endl;
ModelDuck::ModelDuck()
{
m_flyBehavior = new FlyNoWay;
m_quackBehavior = new Quack;
}
void ModelDuck::display()
{
cout << "I am a model duck" << endl;
}
最后是 main 函数。
#include "mallardduck.h"
#include "modelduck.h"
int main(int argc, char *argv[])
{
Duck * mallard = new MallardDuck;
mallard->display();
mallard->performQuack();
mallard->performFly();
Duck * model = new ModelDuck;
model->display();
model->performFly();
model->setFlyBehavior(new FlyRocketPowered);
model->performFly();
}
《Head First 设计模式》例子的C++实现(1 策略模式)的更多相关文章
- Java 设计模式系列(十二)策略模式(Strategy)
Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 学C#之设计模式系列笔记(1)策略模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- JAVA设计模式详解(一)----------策略模式
策略模式,顾名思义就是设计一个策略算法,然后与对象拆分开来将其单独封装到一系列策略类中,并且它们之间可以相互替换.首先LZ举一个例子为大家引出这一个模式. 例子:某公司的中秋节奖励制度为每个员工发放2 ...
- 设计模式学习总结(八)策略模式(Strategy)
策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...
- 《大话设计模式》ruby版代码:策略模式
需求: 商场收银软件,根据客户购买物品的单价和数量,计算费用,会有促销活动,打八折,满三百减一百之类的. 一,使用工厂模式. # -*- encoding: utf-8 -*- #现金收费抽象类 cl ...
- Android设计模式(二)--策略模式
1.定义: The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inter ...
- LVOOP设计模式在路上(二)-- 策略模式
前言 最近工作还挺忙的,连着好些周都是单休了,今天休息在家就来写写关于策略模式的理解和labivew的实现. 正文 1.什么是策略模式 定义是这样描述的:它定义了算法家族,分别封装起来,让它们之间可以 ...
- Java设计模式之(十四)——策略模式
1.什么是策略模式? Define a family of algorithms, encapsulate each one, and make them interchangeable. Strat ...
随机推荐
- Android中的padding和margin的区别
在Android的布局中,常常有人将padding和margin搞混,他们其实不一样的,padding是该控件的内部距离. magin是该控件与其他控件之间的距离.例如 <LinearLayou ...
- Android常用数据类型转换
String转int.float.double.byte[].bitmap Int i = Integer.parseInt(str); Float f = Float.parseFloat(str) ...
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- ViewPager+Fragment切换卡顿解决办法
1.ViewPager设置预加载 我有4个tag,都不想被销毁,设置预加载个数为3. ViewPager viewPager; viewPager.setOffscreenPageLimit(3); ...
- springboot 学习之路 20 (整合RabbitMQ)
整合RabbitMQ: 我的操作系统是window7 ,所以在整合ribbotMQ之前需要先安装rabbitMq服务:安装步骤请参考:window下安装RabbitMQ 这个详细介绍了安装步骤,请按 ...
- 常用的Git命令整理
之前一直忙于项目苦于没有时间总结,今天刚好有时间特来总结一下在工作中常用到的代码版本管理器Git.至于为什么要用Git?Git相比SVN有哪些好处?我就不多说了,前人已经总结的很好.今天主要介绍的是常 ...
- Spring Boot 中配置文件application.properties使用
一.配置文档配置项的调用(application.properties可放在resources,或者resources下的config文件夹里) package com.my.study.contro ...
- IntelliJ IDEA 2017 永久注册方法
https://blog.csdn.net/weixin_39913200/article/details/80859897 在安装的idea下面的bin目录下面有2个文件 : 一个是idea64.e ...
- January 25th, 2018 Week 04th Thursday
What made something precious? Losing it and finding it. 一件东西怎样才会变得珍贵无比?先弄丢了它,然后又找到了. A short time ag ...
- Resct配置less
配置less 安装less-loader yarn add less-loader 打开 webpack.config.dev.js 和 webpack.config.prod.js 找到 test ...