最近在学习设计模式,用的是 《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();}新闻热点
疑难解答
图片精选