当前位置: 首页 > news >正文

【设计模式】 策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,使它们可以相互替换,让客户端代码和算法的具体实现解耦。这样,客户端可以根据不同的需求选择不同的算法,而无需修改原有的代码。

C 实现策略模式

#include <stdio.h>
#include <stdlib.h>// 定义策略接口
typedef struct {void (*execute)(void);
} Strategy;// 具体策略1
void strategy1_execute(void) {printf("Executing Strategy 1\n");
}// 具体策略2
void strategy2_execute(void) {printf("Executing Strategy 2\n");
}// 客户端代码,使用策略接口
void client_code(Strategy* strategy) {strategy->execute();
}int main() {// 创建策略对象Strategy* strategy1 = (Strategy*)malloc(sizeof(Strategy));strategy1->execute = strategy1_execute;Strategy* strategy2 = (Strategy*)malloc(sizeof(Strategy));strategy2->execute = strategy2_execute;// 使用不同的策略client_code(strategy1);client_code(strategy2);// 释放内存free(strategy1);free(strategy2);return 0;
}

C++ 实现策略模式

#include <iostream>// 定义策略接口
class Strategy {
public:virtual void execute() = 0;virtual ~Strategy() {}
};// 具体策略1
class Strategy1 : public Strategy {
public:void execute() override {std::cout << "Executing Strategy 1" << std::endl;}
};// 具体策略2
class Strategy2 : public Strategy {
public:void execute() override {std::cout << "Executing Strategy 2" << std::endl;}
};// 客户端代码,使用策略接口
void client_code(Strategy* strategy) {strategy->execute();
}int main() {// 使用不同的策略Strategy1 strategy1;Strategy2 strategy2;client_code(&strategy1);client_code(&strategy2);return 0;
}

策略模式的优缺点

优点:

灵活性增强:策略模式使得算法独立于客户端使用而变化。可以在运行时动态选择算法,灵活应对不同的需求和场景。
代码重用:各个策略可以被多个客户端共享,避免了代码重复。
扩展性良好:当需要添加新的算法时,只需增加新的策略类,而不需要修改已有的代码。
易于测试:由于策略类封装了具体的算法,因此易于进行单元测试。

缺点:

增加类数量:每个具体策略都需要一个对应的类,如果策略较多,可能会增加类的数量,增加代码维护的复杂性。
客户端必须了解策略:客户端代码必须了解所有的策略,以便进行选择,如果策略较多,可能会增加客户端代码的复杂性。
总体来说,策略模式适用于需要在运行时动态选择算法,并且希望算法和客户端代码解耦的情况。对于简单的情况,可能没有必要使用策略模式,但在复杂的场景下,它可以带来更好的可维护性和可扩展性。

http://www.lryc.cn/news/102330.html

相关文章:

  • Redis优惠券秒杀超卖问题
  • 14个最强大的建筑设计AI工具
  • Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三
  • 【NLP】一个使用PyTorch实现图像分类的迁移学习实例
  • 【wsl-windows子系统】安装、启用、禁用以及同时支持docker-desktop和vmware方案
  • 使用docker部署springboot微服务项目
  • uniapp兼容微信小程序和支付宝小程序遇到的坑
  • LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>
  • 第1章 JavaScript简史
  • DevOps-GitHub/GitLab
  • redis群集(主从复制)
  • F5 LTM 知识点和实验 5-健康检测
  • ❤️创意网页:能量棒页面 - 可爱版(加载进度条)
  • C语言中的操作符(万字详解)
  • Panda 编译时原子化 CSS-in-JS 框架的跨平台方案
  • 【图论】BFS中的最短路模型
  • Linux Mint 21.2 ISO 镜像开放下载
  • 版本适配好帮手 Android SDK Upgrade Assistant / Android Studio Giraffe新功能
  • kafka权威指南学习以及kafka生产配置
  • 自由行的一些小tips
  • uiautomatorViewer无法获取Android8.0手机屏幕截图的解决方案
  • 使用LangChain构建问答聊天机器人案例实战(三)
  • 在windows上安装minio
  • 22. 数据库的隔离级别和锁机制
  • 【题解】[ABC312E] Tangency of Cuboids(adhoc)
  • k8s服务发现之使用 HostAliases 向 Pod /etc/hosts 文件添加条目
  • python中有哪些比较运算符
  • Python网络编程详解:Socket套接字的使用与开发
  • Appium+python自动化(二十六)- Toast提示(超详解)简介
  • SpringBoot自动装配介绍