模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。

舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提取出來進行封裝。我將鴨子的飛行行爲(有的鴨子根本不會飛)和叫法行爲提取出來,定義成飛行的算法族(飛行)。對飛行行爲來說,他的飛行行爲定義為接口(CInterface_Fly),不同的具體飛行方法定義為不同的子類(FlyNoWay、FlyWithWings),都需要實現飛行行爲方法(fly)。鴨子的父類中維護了飛行行爲的指針。在構造具體的鴨子子類(RedHeadDuck)時,將對應的飛行子類傳入,便成實現具體鴨子的飛行行爲。同理,對鴨子的叫法也是一樣的處理,定義成叫法算法組。

模式結構:

源碼:

 1 #ifndef CDUCK_H
 2 #define CDUCK_H
 3 class CInterface_fly;
 4 class CInterface_quak;
 5
 6 class CDuck
 7 {
 8 public:
 9     CDuck();
10     virtual ~CDuck();
11
12 public:
13   virtual void performFly();
14   virtual void performQuak();
15 public:
16     virtual void setFlyBehavior(CInterface_fly* pInterfaceFly);
17     virtual void setQuackBehavior(CInterface_quak* pInterfaceQuak);
18
19 protected:
20    CInterface_fly* m_pInterface_fly;
21    CInterface_quak* m_pInterface_quak;
22
23 };
24
25 #endif // CDUCK_H

 1 #include "duck.h"
 2 #include <interface_fly.h>
 3 #include <interface_quak.h>
 4 #include <QDebug>
 5 CDuck::CDuck()
 6 {
 7
 8 }
 9  CDuck::~CDuck()
10 {
11
12 }
13 void CDuck::setFlyBehavior(CInterface_fly* pInterfaceFly)
14 {
15    m_pInterface_fly = pInterfaceFly;
16 }
17 void CDuck::setQuackBehavior(CInterface_quak* pInterfaceQuak)
18 {
19     m_pInterface_quak = pInterfaceQuak;
20 }
21 void CDuck::performFly()
22 {
23     if(m_pInterface_fly)
24     {
25          m_pInterface_fly->fly();
26     }
27 }
28 void CDuck::performQuak()
29 {
30     if(m_pInterface_quak)
31     {
32          m_pInterface_quak->quak();
33     }
34 }

 1 #include <QCoreApplication>
 2 #include <redheadduck.h>
 3 #include <duck.h>
 4 #include "interface_fly.h"
 5 #include "interface_quak.h"
 6 #include "flywithwings.h"
 7 #include "squeak.h"
 8 int main(int argc, char *argv[])
 9 {
10     QCoreApplication a(argc, argv);
11    CInterface_fly* pInterface_fly = new FlyWithWings();
12    CInterface_quak* pInterface_quak = new Squeak();
13     CDuck* pDuck = new RedHeadDuck();
14     pDuck->setFlyBehavior(pInterface_fly);
15     pDuck->setQuackBehavior(pInterface_quak);
16     pDuck->performFly();
17     pDuck->performQuak();
18       return a.exec();
19 }

源碼下載:http://download.csdn.net/download/gongchao1212/10006758

參考資料:

HeadFirst 設計模式

转载于:https://www.cnblogs.com/vegetable/p/7624215.html

C++設計模式——策略模式相关推荐

  1. 设计模式 — 行为型模式 — 策略模式

    目录 文章目录 目录 策略模式 应用场景 代码示例 策略模式 策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换.这意味着,让一个类的行为(算法)可以 ...

  2. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  3. 23种模式——策略模式

    目录 策略模式 策略模式的收银软件 策略模式的特点 使用场景 优缺点 策略模式和工厂模式的结合 策略(Strategy)模式 本质:分离算法,选择实现. 策略模式:针对一组算法,将每一个算法封装到具有 ...

  4. 模板模式+策略模式优化

    前言 写在最前面,最近在项目中发现一部分代码,可以用模板模式+策略模式来进行优化. 背景 业务中,系统中对订单状态的处理,需要发送对用户短信发送或者微信推送等操作. 发送短信和微信推送钱,需要处理逻辑 ...

  5. 工厂模式+策略模式组合实现电商促销活动

    项目中大多数设计模式都是组合使用的,对于单个设计模式小伙伴们可以去菜鸟教程学习一下,下面使用 Java 实现的工厂模式+策略模式组合实现电商促销 首先,根据策略的不同,一些需要优惠计算,一些需要普通计 ...

  6. java-抽象工厂模式+工厂方法模式+策略模式简单应用实战(登录场景)

    前言 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  7. 工厂模式+策略模式+反射机制解决系统功能模块相似的问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景 痛点 一.如何根据不同条件获取不同的数据库Mapper? 二.如何根据不同条件创建相应的数据库实体对象? 总结 背景 ...

  8. 进阶学习之旅-设计模式之(委派模式策略模式)

    文章目录 1.课程学习目标 2.内容定位 3.委派模式详解 3.1委派模式的定义 3.2 demo案例 3.2.1模拟Boss指派任务给Leader 由员工完成任务执行 3.2.2 模拟spring ...

  9. springboot 使用工厂模式+策略模式替代多重if 案例

    项目背景: 由于做的是物联网项目,现在需要实现的是网关入网+子设备注册:网关有3个逻辑,分别为首次入网.解绑后同一个人入网(恢复).解绑后换人入网(换人).子设备注册: 原先写法是: if(type ...

  10. 混合模式(工厂方法模式+策略模式+门面模式)

    混合模式(工厂方法模式+策略模式+门面模式) 使用这三种模式设计一个简单的计算器程序:计算器是用于计算数值之间进行数学计算后所获得的值.它包含基本的"加减"功能.以上对以上需求进行 ...

最新文章

  1. 聊聊Unsafe的一些使用技巧
  2. c语言输出n以内完数,c语言:输入n,输出不超过n的全部完全数。能帮忙找出怎么错么?...
  3. 国产光刻机的现状究竟如何?
  4. HDU4472 Count
  5. iOS App Launch Option
  6. java堆外内存6_Java堆外内存排查小结
  7. Unity 动画属性
  8. 400 fps!CenterFace+TensorRT部署人脸和关键点检测
  9. Windows XP搜索功能 包含文字 搜索不到内容的解决办法
  10. Java常用开发工具推荐
  11. Hive面试题汇总大全
  12. token是什么意思
  13. 【Origin双y轴】三条曲线,其中两条曲线共用一个y轴
  14. SQL注入之floor报错注入
  15. HTML中的5种空格表示
  16. Type A卡和Type B卡的主要区别
  17. 互联网金融平台常见绑卡鉴权方式分析对比
  18. 名词介绍 CAPEX OPEX
  19. 安卓开发:实现调用相机拍照
  20. java爬虫框架Webcontroller

热门文章

  1. 经验的总结,需要记录。
  2. Web Components 系列(八)—— 自定义组件的样式设置
  3. notepad++列编辑操作
  4. JavaScript创建对象:深入理解编程原理
  5. 使用IDEA编写一个springMVC架构的HelloWorld
  6. [短评]企业裁员行为对整个社会的正面意义
  7. centos mysql-5.5.20_mysql-5.5.20+CentOS 6.2 编译安装全过程详解(2)
  8. JavaWeb——springMVC入门程序
  9. GIS制图人员的自我修养(2)--制图意识
  10. PhoneGap在Android上的插件开发方法介绍