《Head First 设计模式》例子的C++实现(1 策略模式)
2024-10-16 15:14:15
最近在学习设计模式,用的是 《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();
}
最新文章
- Curator Framework的基本使用方法
- C#设计模式系列:访问者模式(Visitor)
- nginx 页面乱码问题
- Scala中的match(模式匹配)
- hdu 1829 A Bug&#39;s Life(分组并查集(偏移量))
- Android平台NDK编程
- HoG feature for human detection(HoG 行人识别)
- Java线程和守护进程
- OpenResty 操作cookies
- JavaScript知识点 思维导图
- H5 标签选择器
- NIO(一)
- Directory 类
- vue中 如何使用less
- openssl链接动态库的方法
- 雷林鹏分享:XML 编码
- sort命令的k选项大讨论【转】
- ListView数据更新后,自动滚动到底部(聊天时常用)| Listview Scroll to the end of the list after updating the list
- vue-cli3预设preset记录
- 【WinSCP】WinSCP 5.x使用密钥连接服务器
热门文章
- Expo大作战(四十一)【完】--expo sdk 之 Assets,BarCodeScanner,AppLoading
- webrtc学习: 部署stun和turn服务器
- [20171113]修改表结构删除列相关问题3.txt
- python第九十五天--js正则
- 为什么内核访问用户数据之前,要做access_ok?【转】
- 10 种机器学习算法的要点(附 Python 和 R 代码)
- ubuntu 14.04安装zabbix3.0以及汉化
- 【记录】GIT 常用命令记录
- Looper loop
- innerHTML、innerText和outerHTML、outerText的区别