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

《Head First 设计模式》例子的C++实现(1 策略模式)的更多相关文章

  1. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  2. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  3. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

  4. Java设计模式从精通到入门三 策略模式

    介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: ​ 以周瑜赔了夫人又折兵的例 ...

  5. JAVA设计模式详解(一)----------策略模式

    策略模式,顾名思义就是设计一个策略算法,然后与对象拆分开来将其单独封装到一系列策略类中,并且它们之间可以相互替换.首先LZ举一个例子为大家引出这一个模式. 例子:某公司的中秋节奖励制度为每个员工发放2 ...

  6. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  7. 《大话设计模式》ruby版代码:策略模式

    需求: 商场收银软件,根据客户购买物品的单价和数量,计算费用,会有促销活动,打八折,满三百减一百之类的. 一,使用工厂模式. # -*- encoding: utf-8 -*- #现金收费抽象类 cl ...

  8. Android设计模式(二)--策略模式

    1.定义: The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inter ...

  9. LVOOP设计模式在路上(二)-- 策略模式

    前言 最近工作还挺忙的,连着好些周都是单休了,今天休息在家就来写写关于策略模式的理解和labivew的实现. 正文 1.什么是策略模式 定义是这样描述的:它定义了算法家族,分别封装起来,让它们之间可以 ...

  10. Java设计模式之(十四)——策略模式

    1.什么是策略模式? Define a family of algorithms, encapsulate each one, and make them interchangeable. Strat ...

随机推荐

  1. Android架构篇--MVP模式的介绍篇

    摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的 ...

  2. Java虚拟机(一)结构原理与运行时数据区域

    我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文 ...

  3. Java并发编程(五)Lock

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...

  4. [20180626]函数与标量子查询14.txt

    [20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...

  5. EF Core扩展工具记录

    Microsoft.EntityFrameworkCore.AutoHistory Microsoft.EntityFrameworkCore 的一个插件,支持自动记录数据更改历史记录. GitHub ...

  6. 鸟哥的 Linux 私房菜Shell Scripts篇(四)

    12.4 条件判断式 只要讲到『程式』的话,那么条件判断式,亦即是『 if then 』这种判别式肯定一定要学习的!因为很多时候,我们都必须要依据某些资料来判断程式该如何进行.举例来说,我们在上头的a ...

  7. [HDFS_add_3] HDFS 机架感知

    0. 说明  HDFS 副本存放策略 && 配置机架感知 1. HDFS 的副本存放策略 HDFS 的副本存放策略是将一个副本存放在本地机架节点上,另外两个副本放在不同机架的不同节点上 ...

  8. 第 15 章 位操作(dualview)

    /*----------------------------------- dualview.c -- 位字段和按位运算符 -----------------------------------*/ ...

  9. MySQL客户端工具的选择

    最近因系统云化项目,学习使用MySQL集群,为了找一款顺手的mysql客户端,反复使用了多个工具,并筛选出一个自认为最满意的,在此分享. 先说我的选择:SQLyog. 尝试的客户端:Toad for ...

  10. Java读取properties文件工具类并解决控制台中文乱码

    1.建立properts文件(error.message.properties) HTTP201= 请求成功并且服务器创建了新的资源 2.在spring-mvc.xml文件(applicationCo ...