国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

《Head First 設計模式》例子的C++實現(1 策略模式)

2019-11-08 02:42:54
字體:
來源:轉載
供稿:網友

最近在學習設計模式,用的是 《Head First 設計模式》這本書。感覺這本書寫的還是很不錯的,深入淺出的介紹了各種常用的設計模式。唯一有點不方便的地方是這本書的例子全都是用的 java 來實現的。而我主要是用 C++。所以就動手將書上的代碼用 C++ 來實現了一遍。

策略模式

這一章用的是個 Duck 的例子。C++ 沒有 interface 的概念,都是用類來實現的。 我將各個策略都放到了 behavior.h 和 behavior.cpp 中。

//behavior.h#ifndef BEHAVIOR_H#define BEHAVIOR_Hclass 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();}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 渝中区| 丰都县| 阿拉善盟| 富蕴县| 扶风县| 防城港市| 洮南市| 句容市| 四会市| 息烽县| 合阳县| 义马市| 信阳市| 新沂市| 七台河市| 颍上县| 天门市| 湖南省| 安徽省| 博野县| 晋城| 贵南县| 贵州省| 千阳县| 安康市| 阿瓦提县| 南通市| 双鸭山市| 无锡市| 阿合奇县| 郯城县| 保靖县| 神农架林区| 永兴县| 青阳县| 陆良县| 福鼎市| 兖州市| 东丽区| 冀州市| 运城市|