作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

UML图:

Strategy模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现

将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式将具体的算法实现委托给具体的Strategy类来实现(ConcreteStrategeA类)

Stragegy类,定义所有支持的算法的公共接口
ConcreteStrategy,封装了具体的算法或行为,继承于Strategy
Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类于使用算法类之间的耦合。

策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。这本身并没有解除客户端需要选择判断的压力。

代码如下:

Strategy.h

  1. 1 #ifndef _STRATEGY_H_
  2. 2 #define _STRATEGY_H_
  3. 3
  4. 4 class Strategy
  5. 5 {
  6. 6 public:
  7. 7 ~Strategy();
  8. 8 virtual void AlgrithmInterface()=0;
  9. 9 protected:
  10. 10 Strategy();
  11. 11 private:
  12. 12 };
  13. 13
  14. 14 class ConcreteStrategyA : public Strategy
  15. 15 {
  16. 16 public:
  17. 17 ConcreteStrategyA();
  18. 18 ~ConcreteStrategyA();
  19. 19 virtual void AlgrithmInterface();
  20. 20 protected:
  21. 21 private:
  22. 22 };
  23. 23
  24. 24 class ConcreteStrategyB : public Strategy
  25. 25 {
  26. 26 public:
  27. 27 ConcreteStrategyB();
  28. 28 ~ConcreteStrategyB();
  29. 29 virtual void AlgrithmInterface();
  30. 30 protected:
  31. 31 private:
  32. 32 };
  33. 33
  34. 34 /*这个类是Strategy模式的关键,
  35. 35 也是Strategy模式和Template模式的根本区别所在。
  36. 36 *Strategy通过“组合”(委托)方式实现算法(实现)的异构,
  37. 37 而Template模式则采取的是继承的方式
  38. 38 这两个模式的区别也是继承和组合两种实现接口重用的方式的区别
  39. 39 */
  40. 40 class Context
  41. 41 {
  42. 42 public:
  43. 43 Context(Strategy*);
  44. 44 ~Context();
  45. 45 void DoAction();
  46. 46 private:
  47. 47 Strategy* _strategy;
  48. 48 };
  49. 49 #endif

Strategy.cpp

  1. 1 #include "Strategy.h"
  2. 2 #include "iostream"
  3. 3
  4. 4 using namespace std;
  5. 5
  6. 6 Strategy::Strategy()
  7. 7 {}
  8. 8
  9. 9 Strategy::~Strategy()
  10. 10 {}
  11. 11
  12. 12 ConcreteStrategyA::ConcreteStrategyA()
  13. 13 {}
  14. 14
  15. 15 ConcreteStrategyA::~ConcreteStrategyA()
  16. 16 {}
  17. 17
  18. 18 void ConcreteStrategyA::AlgrithmInterface()
  19. 19 {
  20. 20 cout << "ConcreteStrategyA::AlgrithmInterface" << endl;
  21. 21 }
  22. 22
  23. 23 ConcreteStrategyB::ConcreteStrategyB()
  24. 24 {}
  25. 25
  26. 26 ConcreteStrategyB::~ConcreteStrategyB()
  27. 27 {}
  28. 28
  29. 29 void ConcreteStrategyB::AlgrithmInterface()
  30. 30 {
  31. 31 cout << "ConcreteStrategyB::AlgrithmInterface" << endl;
  32. 32 }
  33. 33
  34. 34 Context::Context(Strategy* strategy)
  35. 35 {
  36. 36 this->_strategy = strategy;
  37. 37 }
  38. 38
  39. 39 Context::~Context()
  40. 40 {
  41. 41 delete this->_strategy;
  42. 42 }
  43. 43
  44. 44 void Context::DoAction()
  45. 45 {
  46. 46 this->_strategy->AlgrithmInterface();
  47. 47 }

main.cpp

  1. 1 #include "Strategy.h"
  2. 2
  3. 3 int main()
  4. 4 {
  5. 5 /*
  6. 6 Strategy模式和Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。
  7. 7 要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。
  8. 8 组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。
  9. 9 这两种方式各有优缺点
  10. 10 */
  11. 11 //策略A与B可替换
  12. 12 Strategy* pStr = new ConcreteStrategyA();
  13. 13 Context* pcon = new Context(pStr);
  14. 14 pcon->DoAction();
  15. 15
  16. 16 pStr = new ConcreteStrategyB();
  17. 17 pcon = new Context(pStr);
  18. 18 pcon->DoAction();
  19. 19
  20. 20 return 0;
  21. 21 }

策略模式c++【转】的更多相关文章

  1. javascript设计模式:策略模式

    前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...

  2. StrategyPattern (策略模式)

    /** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...

  3. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  4. Java设计模式之策略模式(Strategy)

    前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...

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

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

  6. 《Head First 设计模式》之策略模式

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...

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

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

  8. PHP 策略模式

    策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想 ...

  9. php实现设计模式之 策略模式

    策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.是一种行为模式. 策略模式包含三种角色 1 抽象策略角色: 策略类,通常由一个接口或 ...

  10. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

随机推荐

  1. previous_changes方法

    [27] pry(main)> c = Channel.find 6 => #<Channel id: 6, title: "会员", cid: "96 ...

  2. 谷歌浏览器 DEV Tools

    谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器.伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chrome变成了一个必须的工具.大多数可能熟悉关于chorme的许多特点,例如使用c ...

  3. nyoj19 全排列

    http://acm.nyist.net/JudgeOnline/status.php?pid=19 #include<stdio.h> #include<stdlib.h> ...

  4. Java和PyPy速度对比

    Java和PyPy运行同一段代码,对比结果. Java代码: package javatest; import java.text.DecimalFormat; import java.util.Da ...

  5. Java--时间处理

    package javatest; import java.text.SimpleDateFormat; import java.util.Date; class timeTest{ public s ...

  6. 3Sum Closest & 3Sum Smaller

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  7. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  8. BestCoder17 1002.Select(hdu 5101) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101 题目意思:给出 n 个 classes 和 Dudu 的 IQ(为k),每个classes 都有 ...

  9. hdu 1232 畅通工程 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集入门题.最近在学并查集,它无非包括三个操作:make_set(x).union_set(x ...

  10. apple配置WIFI热点

    打开AirPort打开设置偏好-共享,找到WIFI相关