文章目录

  • 前言
  • 一、策略模式( Strategy 模式)
  • 二、具体源码
    • 1.Strategy.h
    • 2.Strategy.cpp
    • 3.Context.h
    • 4.Context.cpp
    • 5.main.cpp
  • 三、运行结果
  • 总结

前言

Strategy 模式和 Template 模式要解决的问题是相同的,都是为了给业务逻辑具体实现和抽象接口之间的解耦。Strategy 模式将逻辑封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。


一、策略模式( Strategy 模式)

Strategy 模式的关键就是将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式将具体的算法实现委托给具体的 Strategy 类来实现(ConcreteStrategeA类或者oncreteStrategeB类)。UML图如下:

二、具体源码

1.Strategy.h

代码如下(示例):

#ifndef _STRATEGY_H_
#define _STRATEGY_H_ #include <iostream>class Strategy
{public:Strategy();virtual ~Strategy();virtual void AlgrithmInterface() = 0;protected:private:
};class ConcreteStrategyA :public Strategy
{public:ConcreteStrategyA();virtual ~ConcreteStrategyA();void AlgrithmInterface();protected:private:
};class ConcreteStrategyB :public Strategy
{public:ConcreteStrategyB();virtual ~ConcreteStrategyB();void AlgrithmInterface();protected:
private:
};#endif //_STRATEGY_H_

2.Strategy.cpp

代码如下(示例):

#include "Strategy.h"Strategy::Strategy()
{}Strategy::~Strategy()
{std::cout << "~Strategy....." << std::endl;
}void Strategy::AlgrithmInterface()
{}ConcreteStrategyA::ConcreteStrategyA()
{}ConcreteStrategyA::~ConcreteStrategyA()
{std::cout << "~ConcreteStrategyA....." << std::endl;
}void ConcreteStrategyA::AlgrithmInterface()
{std::cout << "test ConcreteStrategyA....." << std::endl;
}ConcreteStrategyB::ConcreteStrategyB()
{}ConcreteStrategyB::~ConcreteStrategyB()
{std::cout << "~ConcreteStrategyB....." << std::endl;
}void ConcreteStrategyB::AlgrithmInterface()
{std::cout << "test ConcreteStrategyB....." << std::endl;
}

3.Context.h

代码如下(示例):

#pragma once
#ifndef _CONTEXT_H_
#define _CONTEXT_H_#include "Strategy.h"class Context
{public:Context(Strategy* stg);~Context();void DoAction();protected:
private://Strategy 通过“组合”(委托)方式实现算法(实现)的异构,而 Template 模式则采取的是继承的方式 *这两个模式的区别也是继承和组合两种实现接口重用的方式的区别Strategy* _stg;
};#endif //_CONTEXT_H_

4.Context.cpp

代码如下(示例):

#include "Context.h"Context::Context(Strategy* stg)
{_stg = stg;
}Context::~Context()
{if (!_stg)delete _stg;
}void Context::DoAction()
{_stg->AlgrithmInterface();
}

5.main.cpp

代码如下(示例):

#include "Context.h"int main(int argc, char* argv[])
{Strategy* ps = new ConcreteStrategyA();Context* pc = new Context(ps);Strategy* ps1 = new ConcreteStrategyB();Context* pc1 = new Context(ps1);pc->DoAction();pc1->DoAction();//释放申请的内存if (nullptr != pc)delete pc;if (nullptr != pc1)delete pc1;return 0;
}

三、运行结果

Strategy 模式运行结果如下:


总结

从上述内容可以看出, Strategy 模式和 Template 模式解决了类似的问题,两者实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体
的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。
这两种方式各有优缺点,如下:

  • 继承:易于修改和扩展那些被复用的实现。但是这样破坏了封装性,继承中父类的实现细节暴露给子类了;当父类的实现更改时,其所有子类将不得不随之改变;而且,从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。
  • 组合:“黑盒”复用,因为被包含对象的内部细节对外是不可见的,封装性好;另外,实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小),可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象基类的指针)。但是,这样设计的缺点也是显而易见的,会引起系统中对象过多。

从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(FavorComposition Over Inheritance)


本文参考《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》,对内容进行整理,方便大家学习。如想学习详细内容,请参考此书。

设计模式【14】——策略模式( Strategy 模式)相关推荐

  1. 前端设计模式之策略(Strategy)模式

    定义 策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户.策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法 ...

  2. JAVA设计模式(14) —行为型模板方法模式(Template Method)

    1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...

  3. java api中的设计模式_Java API 设计模式之策略(Strategy)

    策略设计模式与状态设计模式相类似.我们提到过,状态设计模式包含一个状态对象,该对象封装一个上下文对象的状态.策略设计模式包含一个策略对象.该对象与状态设计模式的状态对象相类似.它们之间的关键不同在于: ...

  4. STRATEGY模式(冒泡算法为例)

    STRATEGY模式 STRATEGY模式使用了一种非常不同的方法来倒置通用算法和具体实现之间的依赖关系. 不是将通用的应用算法放进一个抽象基类中,而是将它放进一个名为BubbleSorter的具体类 ...

  5. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  7. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

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

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

  9. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

最新文章

  1. 自动驾驶汽车事故的罪责追究
  2. .NET系统学习----Globalization Resources
  3. tensorflow 最小二乘拟合详细代码注释
  4. 主流mes厂商_MES市场的前景
  5. 安卓进阶系列-08异步加载AsynsTask使用
  6. DX10 Shadow Volumn Sample Code的Bug修正
  7. IT软件创业之 -- 小软件项目也有风险、也会失败、也会损兵折将
  8. linux筛选方式,使用grep实现精确过滤的五种方法
  9. 【CF-Round-458:D】Bash and a Tough Math Puzzle(判断是否可以通过修改区间内的一个数使区间gcd=x)
  10. Numpy中 tolist() 的用法
  11. LOJ10064黑暗城堡
  12. 在Geany里配置python3的方法!!!含window10下载Geany过程
  13. Rational Rose 画时序图 且保存为图片文件
  14. php 文本编辑器 ueditor
  15. Rust学习第九天——控制测试运行
  16. 计算两点之间的距离(经度)
  17. Ajax安卓成功iOS失败,api.ajax图片上传,ios可以上传成功,安卓上传失败
  18. D3D12渲染技术之常量缓冲区
  19. java初始化字符串数组_在java中如何定义一个字符串数组
  20. 宝藏又小众的五金工具cc0高清摄影图片素材网站分享

热门文章

  1. 中国古代四大神兽图释
  2. ns3中antenna module
  3. PreSonus Studio One 5 Professional v5.0.2 x64 中文版编曲录音软件
  4. 工信部:WiFi 万能钥匙和 WiFi 钥匙等涉嫌危害用户信息
  5. 《校园小助手软件》日常维护
  6. 奇妙的安全旅行之SHA算法
  7. Hoj 3130 Qie-Gao
  8. 七天玩转Redis | Day1、我妹打一把QQ飞车学会了Redis的入门知识
  9. 以太网PHY寄存器分析【转】
  10. Tab Switcher 快捷Tab切换器