设计模式C++实现 —— 策略模式
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。下面以高速缓存(Cache)的替换算法为例,实现策略模式。
什么是Cache的替换算法呢?简单解释一下, 当发生Cache缺失时,Cache控制器必须选择Cache中的一行,并用欲获得的数据来替换它。所采用的选择策略就是Cache的替换算法。下面给出相应的UML图。
ReplaceAlgorithm是一个抽象类,定义了算法的接口,有三个类继承自这个抽象类,也就是具体的算法实现。Cache类中需要使用替换算法,因此维护了一个 ReplaceAlgorithm的对象。这个UML图的结构就是策略模式的典型结构。下面根据UML图,给出相应的实现。
首先给出替换算法的定义。
- //抽象接口
- class ReplaceAlgorithm
- {
- public:
- virtual void Replace() = 0;
- };
- //三种具体的替换算法
- class LRU_ReplaceAlgorithm : public ReplaceAlgorithm
- {
- public:
- void Replace() { cout<<"Least Recently Used replace algorithm"<<endl; }
- };
- class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm
- {
- public:
- void Replace() { cout<<"First in First out replace algorithm"<<endl; }
- };
- class Random_ReplaceAlgorithm: public ReplaceAlgorithm
- {
- public:
- void Replace() { cout<<"Random replace algorithm"<<endl; }
- };
接着给出Cache的定义,这里很关键,Cache的实现方式直接影响了客户的使用方式,其关键在于如何指定替换算法。
方式一:直接通过参数指定,传入一个特定算法的指针。
- //Cache需要用到替换算法
- class Cache
- {
- private:
- ReplaceAlgorithm *m_ra;
- public:
- Cache(ReplaceAlgorithm *ra) { m_ra = ra; }
- ~Cache() { delete m_ra; }
- void Replace() { m_ra->Replace(); }
- };
如果用这种方式,客户就需要知道这些算法的具体定义。只能以下面这种方式使用,可以看到暴露了太多的细节。
- int main()
- {
- Cache cache(new LRU_ReplaceAlgorithm()); //暴露了算法的定义
- cache.Replace();
- return 0;
- }
方式二:也是直接通过参数指定,只不过不是传入指针,而是一个标签。这样客户只要知道算法的相应标签即可,而不需要知道算法的具体定义。
- //Cache需要用到替换算法
- enum RA {LRU, FIFO, RANDOM}; //标签
- class Cache
- {
- private:
- ReplaceAlgorithm *m_ra;
- public:
- Cache(enum RA ra)
- {
- if(ra == LRU)
- m_ra = new LRU_ReplaceAlgorithm();
- else if(ra == FIFO)
- m_ra = new FIFO_ReplaceAlgorithm();
- else if(ra == RANDOM)
- m_ra = new Random_ReplaceAlgorithm();
- else
- m_ra = NULL;
- }
- ~Cache() { delete m_ra; }
- void Replace() { m_ra->Replace(); }
- };
相比方式一,这种方式用起来方便多了。其实这种方式将简单工厂模式与策略模式结合在一起,算法的定义使用了策略模式,而Cache的定义其实使用了简单工厂模式。
- int main()
- {
- Cache cache(LRU); //指定标签即可
- cache.Replace();
- return 0;
- }
上面两种方式,构造函数都需要形参。构造函数是否可以不用参数呢?下面给出第三种实现方式。
方式三:利用模板实现。算法通过模板的实参指定。当然了,还是使用了参数,只不过不是构造函数的参数。在策略模式中,参数的传递难以避免,客户必须指定某种算法。
- //Cache需要用到替换算法
- template <class RA>
- class Cache
- {
- private:
- RA m_ra;
- public:
- Cache() { }
- ~Cache() { }
- void Replace() { m_ra.Replace(); }
- };
使用方式如下:
- int main()
- {
- Cache<Random_ReplaceAlgorithm> cache; //模板实参
- cache.Replace();
- return 0;
- }
本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985
设计模式C++实现 —— 策略模式相关推荐
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式入门(策略模式)
[0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...
- 设计模式 之美 -- 策略模式
策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- 《研磨设计模式》chap17 策略模式(2) 总结
1. 新增加context 上下文类 eg. 发工资:发人民币和发美元 public interface PaymentStrategy {//公司给某人真正支付工资 public void pay( ...
- 设计模式のStrategyPattern(策略模式)----行为模式
一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...
- [设计模式] javascript 之 策略模式
策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...
- LOL设计模式之「策略模式」
之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...
- 从王者荣耀看设计模式(一.策略模式)
从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...
- 《设计模式》之策略模式
一.什么是策略模式? 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略. 1.1.策略模式结构 ...
最新文章
- 我与技术------2012程序之路
- uva 10161 Ant on a Chessboard 蛇形矩阵 简单数学题
- Python之 sklearn:sklearn中的RobustScaler 函数的简介及使用方法之详细攻略
- 关于Android中Service的手动、自动以及其在特殊条件下的重启
- linux双网口绑定,双网口绑定bond
- 从燃尽图看项目管理:你的项目哪里出错了?(燃尽图类型全解析)
- 多C++标准版本指定
- 编程思想:面向对象和面向过程
- java反射po转vo_Java项目的(PO,VO,TO,BO,DAO,POJO)解释(转)
- bzoj 1677: [Usaco2005 Jan]Sumsets 求和(DP)
- python 01列表异或_python运算符及优先级顺序
- java连接Neo4j服务器
- CF1042F Leaf Sets
- 阿里巴巴Java开发手册评述
- 分类、回归和聚类辨析
- 北京今日起最低工资和养老金标准全部上调
- 计算机基础excel操作试题,大学计算机基础 excel测试题 求答案~~喵~~
- 瀑布流插件masonry
- 【沧海拾昧】微机原理:可编程串行接口芯片8251A
- 【原创】基于SpringBoot的同城生鲜门店配送系统(SpringBoot配送系统毕业设计)