策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。下面以高速缓存(Cache)的替换算法为例,实现策略模式。

什么是Cache的替换算法呢?简单解释一下, 当发生Cache缺失时,Cache控制器必须选择Cache中的一行,并用欲获得的数据来替换它。所采用的选择策略就是Cache的替换算法。下面给出相应的UML图。

ReplaceAlgorithm是一个抽象类,定义了算法的接口,有三个类继承自这个抽象类,也就是具体的算法实现。Cache类中需要使用替换算法,因此维护了一个  ReplaceAlgorithm的对象。这个UML图的结构就是策略模式的典型结构。下面根据UML图,给出相应的实现。

首先给出替换算法的定义。

[cpp] view plaincopyprint?
  1. //抽象接口
  2. class ReplaceAlgorithm
  3. {
  4. public:
  5. virtual void Replace() = 0;
  6. };
  7. //三种具体的替换算法
  8. class LRU_ReplaceAlgorithm : public ReplaceAlgorithm
  9. {
  10. public:
  11. void Replace() { cout<<"Least Recently Used replace algorithm"<<endl; }
  12. };
  13. class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm
  14. {
  15. public:
  16. void Replace() { cout<<"First in First out replace algorithm"<<endl; }
  17. };
  18. class Random_ReplaceAlgorithm: public ReplaceAlgorithm
  19. {
  20. public:
  21. void Replace() { cout<<"Random replace algorithm"<<endl; }
  22. };

接着给出Cache的定义,这里很关键,Cache的实现方式直接影响了客户的使用方式,其关键在于如何指定替换算法。

方式一:直接通过参数指定,传入一个特定算法的指针。

[cpp] view plaincopyprint?
  1. //Cache需要用到替换算法
  2. class Cache
  3. {
  4. private:
  5. ReplaceAlgorithm *m_ra;
  6. public:
  7. Cache(ReplaceAlgorithm *ra) { m_ra = ra; }
  8. ~Cache() { delete m_ra; }
  9. void Replace() { m_ra->Replace(); }
  10. };

如果用这种方式,客户就需要知道这些算法的具体定义。只能以下面这种方式使用,可以看到暴露了太多的细节。

[cpp] view plaincopyprint?
  1. int main()
  2. {
  3. Cache cache(new LRU_ReplaceAlgorithm()); //暴露了算法的定义
  4. cache.Replace();
  5. return 0;
  6. }

方式二:也是直接通过参数指定,只不过不是传入指针,而是一个标签。这样客户只要知道算法的相应标签即可,而不需要知道算法的具体定义。

[cpp] view plaincopyprint?
  1. //Cache需要用到替换算法
  2. enum RA {LRU, FIFO, RANDOM}; //标签
  3. class Cache
  4. {
  5. private:
  6. ReplaceAlgorithm *m_ra;
  7. public:
  8. Cache(enum RA ra)
  9. {
  10. if(ra == LRU)
  11. m_ra = new LRU_ReplaceAlgorithm();
  12. else if(ra == FIFO)
  13. m_ra = new FIFO_ReplaceAlgorithm();
  14. else if(ra == RANDOM)
  15. m_ra = new Random_ReplaceAlgorithm();
  16. else
  17. m_ra = NULL;
  18. }
  19. ~Cache() { delete m_ra; }
  20. void Replace() { m_ra->Replace(); }
  21. };

相比方式一,这种方式用起来方便多了。其实这种方式将简单工厂模式与策略模式结合在一起,算法的定义使用了策略模式,而Cache的定义其实使用了简单工厂模式。

[cpp] view plaincopyprint?
  1. int main()
  2. {
  3. Cache cache(LRU); //指定标签即可
  4. cache.Replace();
  5. return 0;
  6. }

上面两种方式,构造函数都需要形参。构造函数是否可以不用参数呢?下面给出第三种实现方式。

方式三:利用模板实现。算法通过模板的实参指定。当然了,还是使用了参数,只不过不是构造函数的参数。在策略模式中,参数的传递难以避免,客户必须指定某种算法。

[cpp] view plaincopyprint?
  1. //Cache需要用到替换算法
  2. template <class RA>
  3. class Cache
  4. {
  5. private:
  6. RA m_ra;
  7. public:
  8. Cache() { }
  9. ~Cache() { }
  10. void Replace() { m_ra.Replace(); }
  11. };

使用方式如下:

[cpp] view plaincopyprint?
  1. int main()
  2. {
  3. Cache<Random_ReplaceAlgorithm> cache; //模板实参
  4. cache.Replace();
  5. return 0;
  6. }

本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

设计模式C++实现 —— 策略模式相关推荐

  1. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  2. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  3. 设计模式 之美 -- 策略模式

    策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...

  4. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  5. 《研磨设计模式》chap17 策略模式(2) 总结

    1. 新增加context 上下文类 eg. 发工资:发人民币和发美元 public interface PaymentStrategy {//公司给某人真正支付工资 public void pay( ...

  6. 设计模式のStrategyPattern(策略模式)----行为模式

    一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...

  7. [设计模式] javascript 之 策略模式

    策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...

  8. LOL设计模式之「策略模式」

    之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...

  9. 从王者荣耀看设计模式(一.策略模式)

    从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...

  10. 《设计模式》之策略模式

    一.什么是策略模式? 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略. 1.1.策略模式结构 ...

最新文章

  1. 我与技术------2012程序之路
  2. uva 10161 Ant on a Chessboard 蛇形矩阵 简单数学题
  3. Python之 sklearn:sklearn中的RobustScaler 函数的简介及使用方法之详细攻略
  4. 关于Android中Service的手动、自动以及其在特殊条件下的重启
  5. linux双网口绑定,双网口绑定bond
  6. 从燃尽图看项目管理:你的项目哪里出错了?(燃尽图类型全解析)
  7. 多C++标准版本指定
  8. 编程思想:面向对象和面向过程
  9. java反射po转vo_Java项目的(PO,VO,TO,BO,DAO,POJO)解释(转)
  10. bzoj 1677: [Usaco2005 Jan]Sumsets 求和(DP)
  11. python 01列表异或_python运算符及优先级顺序
  12. java连接Neo4j服务器
  13. CF1042F Leaf Sets
  14. 阿里巴巴Java开发手册评述
  15. 分类、回归和聚类辨析
  16. 北京今日起最低工资和养老金标准全部上调
  17. 计算机基础excel操作试题,大学计算机基础 excel测试题 求答案~~喵~~
  18. 瀑布流插件masonry
  19. 【沧海拾昧】微机原理:可编程串行接口芯片8251A
  20. 【原创】基于SpringBoot的同城生鲜门店配送系统(SpringBoot配送系统毕业设计)

热门文章

  1. Java反转单链表(code)
  2. curl 怎么在xp下使用_Http Post 快速使用
  3. springboot 与shiro整合
  4. vue自定义组件,插槽,自定义事件
  5. 怎么升级计算机硬盘,研究僧 篇一:记一次老电脑的升级之路
  6. n个字符串按照字典序排列
  7. uoj#188. 【UR #13】Sanrd(Min_25筛)
  8. 新加入“扫码阅读”功能
  9. 利用SVN工具下载OpenCore代码
  10. 应用市场中包名(package name)的唯一性