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

Strategy模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现
将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式将具体的算法实现委托给具体的Strategy类来实现(ConcreteStrategeA类)
Stragegy类,定义所有支持的算法的公共接口
ConcreteStrategy,封装了具体的算法或行为,继承于Strategy
Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类于使用算法类之间的耦合。
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。这本身并没有解除客户端需要选择判断的压力。
代码如下:
Strategy.h

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

Strategy.cpp

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

main.cpp

1 #include "Strategy.h"
2
3 int main()
4 {
5 /*
6 Strategy模式和Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。
7 要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。
8 组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。
9 这两种方式各有优缺点
10 */
11 //策略A与B可替换
12 Strategy* pStr = new ConcreteStrategyA();
13 Context* pcon = new Context(pStr);
14 pcon->DoAction();
15
16 pStr = new ConcreteStrategyB();
17 pcon = new Context(pStr);
18 pcon->DoAction();
19
20 return 0;
21 }
策略模式c++【转】的更多相关文章
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- StrategyPattern (策略模式)
/** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...
- JAVA 设计模式之策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...
- Java设计模式之策略模式(Strategy)
前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 《Head First 设计模式》之策略模式
作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...
- 学C#之设计模式系列笔记(1)策略模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...
- PHP 策略模式
策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想 ...
- php实现设计模式之 策略模式
策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.是一种行为模式. 策略模式包含三种角色 1 抽象策略角色: 策略类,通常由一个接口或 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
随机推荐
- 在服务器上远程链接另一台服务器的数据库的方法how to connet the database from the other host
iwangzheng.com 16:57 [root@a02.cmsapi]$ mysql -u<username> -p<password> -h10.103.xx.xx W ...
- RPM常用组合【转载】
RPM常用组合 -ivh:安装显示安装进度--install--verbose--hash -Uvh:升级软件包--Update: -qpl:列出RPM软件包内的文件信息[Query Package ...
- Gson @Expose熟悉和@SerializedName属性
这两个属性一般配套使用. 1.@Expose标签的2个属性. deserialize (boolean) 反序列化 默认 true serialize (boolean) 序列 ...
- 默认hosts后面为files dns
售后工程师 : 您好,问题已经解决,问题原因是您修改了/etc/nsswitch.conf配置文件中的hosts:这项导致的,默认hosts后面为files dns,但是后面去掉了DNS导致直接使用本 ...
- linux安装setup工具
如果你的Linux系统是最小化安装的,可能会没有setup命令工具,环境是centos 5.8 安装setup命令工具的步骤. 安装setuptool #yum install setuptool 系 ...
- Segment Tree Modify
For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in thi ...
- (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...
- BSD学习(BSD系统的历史和目标)
UNIX系统的历史 unix系统的发展历程大概经历以下几个阶段: 贝尔实验室(Bell Laboratories)阶段,该实验室发明了UNIX 加州大学伯克利分校(University of Cali ...
- poj 3080 Blue Jeans 解题报告
题目链接:http://poj.org/problem?id=3080 该题属于字符串处理中的串模式匹配问题.题目要求我们:给出一个DNA碱基序列,输出最长的相同的碱基子序列.(保证在所有的序列中都有 ...
- ext上传文件到mysql上
不废话,上代码: controller如下: /** * 上传附件 * @param request * @param baseBlob * @param response */ @RequestMa ...