国产探花免费观看_亚洲丰满少妇自慰呻吟_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();}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 乐亭县| 西安市| 英德市| 乌海市| 綦江县| 清远市| 沿河| 常宁市| 黎平县| 天长市| 新源县| 昂仁县| 武山县| 木兰县| 桐庐县| 姜堰市| 桃源县| 天长市| 龙州县| 乌审旗| 武宁县| 库车县| 宜春市| 衡水市| 长武县| 云浮市| 绥中县| 彩票| 白银市| 三河市| 和平县| 临城县| 原阳县| 绵竹市| 惠水县| 德化县| 鹿泉市| 平武县| 怀来县| 土默特左旗| 绥江县|