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

最新文章

  1. Curator Framework的基本使用方法
  2. C#设计模式系列:访问者模式(Visitor)
  3. nginx 页面乱码问题
  4. Scala中的match(模式匹配)
  5. hdu 1829 A Bug&#39;s Life(分组并查集(偏移量))
  6. Android平台NDK编程
  7. HoG feature for human detection(HoG 行人识别)
  8. Java线程和守护进程
  9. OpenResty 操作cookies
  10. JavaScript知识点 思维导图
  11. H5 标签选择器
  12. NIO(一)
  13. Directory 类
  14. vue中 如何使用less
  15. openssl链接动态库的方法
  16. 雷林鹏分享:XML 编码
  17. sort命令的k选项大讨论【转】
  18. ListView数据更新后,自动滚动到底部(聊天时常用)| Listview Scroll to the end of the list after updating the list
  19. vue-cli3预设preset记录
  20. 【WinSCP】WinSCP 5.x使用密钥连接服务器

热门文章

  1. Expo大作战(四十一)【完】--expo sdk 之 Assets,BarCodeScanner,AppLoading
  2. webrtc学习: 部署stun和turn服务器
  3. [20171113]修改表结构删除列相关问题3.txt
  4. python第九十五天--js正则
  5. 为什么内核访问用户数据之前,要做access_ok?【转】
  6. 10 种机器学习算法的要点(附 Python 和 R 代码)
  7. ubuntu 14.04安装zabbix3.0以及汉化
  8. 【记录】GIT 常用命令记录
  9. Looper loop
  10. innerHTML、innerText和outerHTML、outerText的区别