行为模式->策略模式
来源:互联网 发布:人工智能服装设计打板 编辑:程序博客网 时间:2024/06/05 23:57
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。
实现某一个功能有多条途径,每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。本章我们将介绍一种为了适应算法灵活性而产生的设计模式——策略模式。 从A到B 可以 火车 飞机 骑车 步行各种方法。
在策略模式中,我们可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封装算法的类我们都可以称之为一种策略(Strategy), 策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开,
什么是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; }策略模式 是一种定义一系列算法的方法。 所有算法完成相同工作只是实现方式不同。他们以相同方式调用同样接口。 策略模式为每个算法建立了自己类,方便扩展跟单元测试, 策略模式是用来封装算法的。但是实践中我们可以封装任何类型的规则
- 行为模式-策略模式
- 行为模式-策略模式
- 策略模式 - 行为模式
- 行为模式->策略模式
- 行为型-策略模式
- 搭配行为--策略模式
- 行为型模式-策略
- 设计模式-行为-策略
- 行为模式 - 策略模式(Strategy)
- 行为型模式--策略模式
- 策略模式--对象行为模式
- 行为模式之策略模式
- 行为型模式-策略模式
- 行为模式之策略模式
- 行为型模式--策略模式
- 设计模式--行为模式--策略模式--Java
- 设计模式 - 行为型模式 - 策略模式
- 设计模式 行为模式之策略模式
- 不要从战略、技术出发做产品——陆树燊
- MVC设计模式 转发和重定向
- Echarts中的gauge仪表盘.(特殊加一句代码)
- SQL Server2008 安装失败后的解决办法
- windows编程简介
- 行为模式->策略模式
- 用户需求和分析——张有亮
- 让你的微信小程序具有在线支付功能
- C/C++学习(4)函数与指针取地址符
- eclipse中下载maven插件解决办法
- 我的产品观
- 将博客搬至CSDN
- H2O学习笔记(八)——Sparkling Water
- 用户需求和分析