最近在学习设计模式,用的是 《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();
}