【GeekBand】C++设计模式笔记4_Strategy_策略模式

news/2024/9/22 3:58:39/

1. “组件协作”模式

  • 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    • Template Method
    • Strategy
    • Observer / Event

2. Strategy 策略模式

2.1 动机(Motivation)

  • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
  • 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

2.2 模式定义

定义一系列算法,把它们一个个封装起来(ps:每个算法一个具体类),并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子变化)。
——《设计模式》 GoF

2.3 实例代码

2.3.1 strategy1
// 税率类
enum TaxBase {CN_Tax,		// 中国US_Tax,		// 美国DE_Tax,		// 德国FR_Tax      // 更改,增加法国税率
};// 订单类
class SalesOrder {TaxBase tax;	// 税率
public:double CalculateTax() {// ...if (tax == CN_Tax) {// CN***********}else if (tax == US_Tax) {// US***********}else if (tax == DE_Tax) {// DE***********}else if (tax == FR_Tax) {  // 更改,条件判断语句中增加对法国税率的分支// ...}// ....}
};
2.3.2 strategy2
// 税率基类
class TaxStrategy {
public:virtual double Calculate(const Context& context)=0;	// 纯虚函数virtual ~TaxStrategy() {}	// 基类的析构函数要声明成virtual
};// 中国税率,继承基类,重写虚函数
class CNTax : public TaxStrategy {
public:virtual double Calculate(const Context& context) {// ***********}
};// 美国税率,继承基类,重写虚函数
class USTax : public TaxStrategy {
public:virtual double Calculate(const Context& context) {// ***********}
};// 德国税率,继承基类,重写虚函数
class DETax : public TaxStrategy{
public:virtual double Calculate(const Context& context) {// ***********}
};//*********************************
//扩展,法国税率,继承基类,重写虚函数
class FRTax : public TaxStrategy {
public:virtual double Calculate(const Context& context) {// .........}
};//*********************************
// 应用程序,订单类
class SalesOrder{
private:TaxStrategy* strategy;	// 基类指针,为了使用多态,声明只能是指针,不能是对象public:SalesOrder(StrategyFactory* strategyFactory) {this->strategy = strategyFactory->NewStrategy();	// 工厂模式创建对象}~SalesOrder() {delete this->strategy;}public double CalculateTax() {// ...Context context();double val = strategy->Calculate(context);	// 多态调用// ...}  
};

2.4 结构(Structure)

在这里插入图片描述

2.5 要点总结

  • Strategy及其子类为组件提供了一系列可重用的算法(ps:实例中的各个具体类),从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
  • Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
  • 如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

http://www.ppmy.cn/news/1528684.html

相关文章

简单多状态dp第二弹 leetcode -删除并获得点数 -粉刷房子

740. 删除并获得点数 删除并获得点数 分析: 使用动态规划解决 这道题依旧是 打家劫舍I 问题的变型。 我们注意到题目描述,选择 x 数字的时候, x - 1 与 x 1 是不能被选择的。像不像 打家劫舍 问题中,选择 i 位置的金额之后,就不…

iOS - TestFlight使用

做的项目需要给外部人员演示,但是不方便获取对方设备的UDID,于是采用TestFlight 的方式邀请外部测试人员的方式给对方安装测试App,如果方便获取对方设备的UDID,可以使用蒲公英 1.在Xcode中Archive完成后上传App Store Connect之前…

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解(入门 原理 实战)系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时,我们后端的 AI 处理能力有限,例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

【秋招笔试-支持在线评测】8.28华为秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 华为专栏传送🚪 -> 🧷华为春秋招笔试 目前今年秋招的笔…

2024华为杯研赛E题保姆级教程思路分析

E题题目:高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理,实际上,E题的难度相对来说较低,大家不用畏惧视频的处理,被这个吓到。实际上,这个不难,解决了视频的处理问题,…

FloodFill算法(DFS+BFS)【上】

文章目录 FloodFill算法733. 图像渲染题目解析算法原理代码实现 200. 岛屿数量题目解析算法原理代码实现 695. 岛屿的最大面积题目解析算法原理代码实现 130. 被围绕的区域题目解析算法原理代码实现 FloodFill算法 FloodFill算法,中文名叫洪水灌溉 这些模拟一块区域…

Nginx配置参数中文说明

Nginx配置参数中文详细 #定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; # #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /var/log/nginx/error.log info; # #进程文件 pid…

PHP悦读随行一键借阅图书小程序

悦读随行:一键借阅图书馆小程序,让阅读与你同行 📚 封面:解锁阅读新方式 在这个信息爆炸的时代,我们总在寻找更高效、更便捷的方式来获取知识。今天,就让我们一起探索“悦读随行一键借阅图书馆小程序”&am…