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

设计模式(018)行为型之策略模式

        策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个对象,并使它们可以互换。策略模式使得算法的变化可以独立于使用算法的客户端。在策略模式中,有三个核心角色:策略接口(Strategy)、具体策略(ConcreteStrategy)、以及上下文(Context)。
① 策略接口(Strategy):定义了一个算法族的接口。
② 具体策略(ConcreteStrategy):实现了策略接口,封装了具体的算法实现。
③ 上下文(Context):维护一个对策略对象的引用,负责将客户端请求委托给具体的策略对象。
策略模式的核心思想是将算法的定义与使用分离,使得算法可以独立于客户端进行变化、扩展和替换

1、场景设计

实现场景:设计A、B两种策略,同一个客户端可以根据需要从两种策略中选择使用。

2、C++实现

`Strategy` 是策略接口,定义了一个纯虚的 `execute()` 方法。`ConcreteStrategyA` 和 `ConcreteStrategyB` 是具体策略,分别实现了 `execute()` 方法来执行具体的算法。`Context` 是上下文,持有一个策略对象的指针,并且负责将客户端的请求委托给具体的策略对象。在 `main()` 函数中,我们创建了两个具体策略对象,然后通过 `Context` 对象执行了这些策略。 

#include <iostream>// 策略接口
class Strategy {public:virtual void execute() = 0;
};// 具体策略A
class ConcreteStrategyA : public Strategy {public:void execute() override {std::cout << "Executing strategy A" << std::endl;}
};// 具体策略B
class ConcreteStrategyB : public Strategy {public:void execute() override {std::cout << "Executing strategy B" << std::endl;}
};// 上下文
class Context {private:Strategy *strategy;public:Context(Strategy *strat) : strategy(strat) {}void setStrategy(Strategy *strat) {strategy = strat;}void executeStrategy() {if (strategy) {strategy->execute();}}
};int main() {ConcreteStrategyA strategyA;ConcreteStrategyB strategyB;Context context(&strategyA);context.executeStrategy();context.setStrategy(&strategyB);context.executeStrategy();return 0;
}

3、Java实现

`Strategy` 是策略接口,定义了一个执行算法的方法 `execute()`。`ConcreteStrategyA` 和 `ConcreteStrategyB` 是具体策略,分别实现了 `execute()` 方法来执行具体的算法。`Context` 是上下文,维护一个对策略对象的引用,并且负责将客户端的请求委托给具体的策略对象。在 `main()` 方法中,我们创建了上下文对象,并分别设置了两种不同的策略,然后执行策略。 

package behavioralpattern.strategy;public class StrategyDemo {// 策略接口interface Strategy {void execute();}// 具体策略Astatic class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy A");}}// 具体策略Bstatic class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy B");}}// 上下文static class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}}public static void main(String[] args) {Context context = new Context();Strategy strategyA = new ConcreteStrategyA();Strategy strategyB = new ConcreteStrategyB();context.setStrategy(strategyA);context.executeStrategy();context.setStrategy(strategyB);context.executeStrategy();}
}

相关文章:

设计模式(018)行为型之策略模式

策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装成一个对象&#xff0c;并使它们可以互换。策略模式使得算法的变化可以独立于使用算法的客户端。在策略模式中&#xff0c;有三个核心角色&#xff1a;策略接口&#xff08;Strategy&#…...

c++关键字: =delete和=default

delete 概述 delete关键字是c11新增的关键字&#xff0c;主要用于的场景是&#xff1a;当我们不希望类中的函数被类对象在外部调用的时候&#xff0c;我们就可以使用这个关键字。 其实&#xff0c;之前我们实现这种功能是将这些函数放在private修饰符下&#xff0c;但是这种方…...

JSON

文章目录 JSONJSON 的定义格式快速入门JSON 对象和字符串对象转换JSON 在 java 中使用JSON与java对象的转换JSON与List集合的转换JSON与Map的转换 JSON JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09; JSON 是轻量级的文本数据交换格式…...

Python | 超前滞后分析

Nino SST Indices (Nino 12, 3, 3.4, 4; ONI and TNI) 有几个指标用于监测热带太平洋&#xff0c;所有这些指标都是基于海表温度(SST)异常在一个给定的区域的平均值。通常&#xff0c;异常是相对于30年的周期来计算的。厄尔尼诺3.4指数(Nio 3.4 index)和海洋厄尔尼诺指数(Ocea…...

Linux CPU利用率

Linux CPU利用率 在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单&#xff0c;说复杂也不是那么…...

vue3实现导出pdf、png功能

准备做的系统中出现了 想导出当前页面的png或者pdf设计数据较多后端做可能比较麻烦 就自己研究了一下 1、安装html2canvas 、jspdf包 npm install --save html2canvas // 可以将dom元素转为一张图片 npm install --save jspdf // 导出为PDF格式 2、vue组件中引用&#x…...

what is tty?

waht is tty? 黑话&#xff1a;TTY 为什么使用Linux的时候CtrlC就会终止一个命令运行,ta是如何设置的? stty -a 桌面切换 CTRL ALT F1 – 锁屏 CTRL ALT F2 – 桌面环境 CTRL ALT F3 – TTY3 CTRL ALT F4 – TTY4 CTRL ALT F5 – TTY5 CTRL ALT F6 – TTY6...

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…...

07 Php学习:运算符

PHP 算术运算符 在 PHP 中&#xff0c;算术运算符用于执行基本的数学运算&#xff0c;包括加法、减法、乘法、除法、取余数&#xff0c;负数运算、取反和并置运算。以下是这些运算符的详细解释和示例&#xff1a; 加法运算符 &#xff1a;用于将两个数值相加。 $a 5; $b 3;…...

做了多年前端,有没有想在python,go,nodejs,.net,java,c++中学一门后端,推荐

作为一名经验丰富的前端开发者&#xff0c;选择学习后端技术是一个重要的职业发展决策。Python、Go、Node.js、.NET、Java和C都是强大的后端开发语言&#xff0c;每门语言都有其特定的优势和应用场景。以下是对这些技术的分析&#xff0c;以帮助你做出选择&#xff1a; 目录 …...

JR-SMD201-P便携式网络解码器

详细介绍&#xff1a; JR-SMD201-P便携式网络解码器采用1/2U设计&#xff0c;支持AVS/H.265/H.264/MPEG2解码&#xff0c;支持IP输入&#xff0c;支持1080P/1080I/720P/576I/480I多种分辨率&#xff0c;支持DRA/AC3/EAC3/AAC/MPEG等音频。 产品特点 支持输入方式IP 接口丰富&a…...

线程池阻塞队列的选择

一、背景 想起前两年被问到阻塞队列怎么选&#xff0c;有界是必然的&#xff0c; ArrayBlockingQueue、LinkedBlockingQueue怎么选呢。 二、打开源码看看 ArrayBlockingQueue arrayBlockingQueue new ArrayBlockingQueue(3);LinkedBlockingQueue linkedBlockingQueue new Lin…...

linux内核驱动-在内核代码里添加设备结点

linux中&#xff0c;一切皆文件 我们在用户层用一些系统函数&#xff08;如&#xff1a;fopen等等&#xff09;时&#xff0c;会进入内核&#xff0c;内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的&#xff08;驱动&#xff09;函数 我们在前面已经…...

【算法优选】 动态规划之简单多状态dp问题——贰

文章目录 &#x1f38b;前言&#x1f334;[买卖股票的最佳时机含冷冻期](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/)&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f388;状态表示&#xff1a;&#x1f388;…...

【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )

文章目录 13.路径总和13.1问题13.2解法一&#xff1a;递归13.2.1递归思路&#xff08;1&#xff09;确定递归函数参数以及返回值&#xff08;2&#xff09;确定终止条件&#xff08;3&#xff09;确定递归逻辑 13.2.2代码实现 14.路径总和 ||14.1问题14.2解法一&#xff1a;递归…...

代码学习记录37----动态规划

随想录日记part37 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.06 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及四个方面&#xff1a; 完全背包&#xff1b;零钱兑换 II &#xff1b;组合总和 Ⅳ 和单词拆分 …...

Spring Boot:Web开发之三大组件的整合

Spring Boot 前言Spring Boot 整合 ServletSpring Boot 整合 FilterSpring Boot 整合 Listener前言 在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filter 是处于客户端与服务…...

2024.3.15力扣每日一题——卖木头块

2024.3.15 题目来源我的题解方法一 记忆化搜索&#xff08;自顶向下&#xff09;方法二 动态规划&#xff08;自底向上&#xff09; 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2312 我的题解 方法一 记忆化搜索&#xff08;自顶向下&#xff09; 用 f(x,y)表示当木…...

vue快速入门(七)内联语句

注释很详细&#xff0c;直接上代码 上一篇 新增内容 button点击事件绑定内联语句写法与要求 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…...

Docker实战教程 第2章 Docker基础

3-1 Docker介绍 什么是Docker 虚拟化&#xff0c;容器 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&…...

2023最新版Prometheus+Grafana监控系统搭建指南(含Docker-compose部署)

2023云原生监控实战&#xff1a;基于Docker-compose的PrometheusGrafana全栈部署指南 在云原生技术席卷各行各业的今天&#xff0c;监控系统已成为保障业务稳定性的神经中枢。传统监控方案在面对容器化、微服务架构时往往力不从心&#xff0c;而Prometheus作为CNCF毕业项目&…...

阿里图标库(Iconfont)的本地引入 详细步骤

阿里图标库&#xff08;Iconfont&#xff09;本地引入 Vue3 详细步骤&#xff08;文字版&#xff09; 一、准备工作 登录 Iconfont 官网 访问 Iconfont 官网&#xff0c;使用账号登录&#xff08;若无账号需注册&#xff09;。 选择图标并加入项目 在搜索框输入关键词&#x…...

MGeo中文地址结构化教程:从原始文本到标准GeoJSON格式输出的完整转换流程

MGeo中文地址结构化教程&#xff1a;从原始文本到标准GeoJSON格式输出的完整转换流程 1. 引言&#xff1a;为什么我们需要地址结构化&#xff1f; 你有没有遇到过这样的场景&#xff1f;用户填写的收货地址五花八门&#xff1a;“北京市海淀区中关村大街27号”、“北京海淀中…...

Drizzle ORM性能优化终极指南:查询优化与缓存策略详解

Drizzle ORM性能优化终极指南&#xff1a;查询优化与缓存策略详解 【免费下载链接】drizzle-orm drizzle-team/drizzle-orm: 是一个基于 C 的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;支持 MySQL 和 SQLite 数据库。适合对 C、数据库开发以及想要使用轻量级 ORM…...

将 OnePlus 手机备份到云服务

丢失 OnePlus 设备上的珍贵照片、重要联系人、短信或应用数据可能会令人非常沮丧&#xff0c;无论是意外删除、设备损坏、被盗&#xff0c;甚至是恢复出厂设置。这时&#xff0c;云备份就派上了用场。它提供了一种简单可靠的数据保护方式&#xff0c;确保您可以随时随地在新 On…...

HarmonyOS6 半年磨一剑 - RcTextarea 组件核心架构与类型系统设计

文章目录前言一、组件整体架构1.1 文件结构1.2 装饰器体系二、类型系统深度解析2.1 边框模式类型2.2 清空触发类型2.3 格式化与解析函数类型2.4 文本对齐与回车键类型三、核心参数体系3.1 必传参数3.2 尺寸相关参数3.3 功能开关参数四、内部状态与生命周期4.1 内部状态设计4.2 …...

AI写论文实用宝典,4款AI论文生成工具搞定各类论文写作!

在2025年的学术写作智能化浪潮中&#xff0c;越来越多的人开始依赖AI写论文工具进行创作。尽管这些工具的使用越来越普遍&#xff0c;但在撰写硕士、博士论文等较长篇幅的学术文章时&#xff0c;许多AI论文写作工具往往陷入缺乏理论深度和逻辑性不强的问题。普通的AI写专著或AI…...

别再一条条Update了!MyBatis批量更新数据,用这个Case When写法性能翻倍

MyBatis批量更新性能优化实战&#xff1a;告别低效循环&#xff0c;拥抱CASE WHEN 每次看到代码里用循环一条条执行update语句&#xff0c;我的数据库性能监控图表就会剧烈波动——这简直是DBA的噩梦。上周排查一个后台任务卡死问题&#xff0c;发现同事在处理5万条数据更新时&…...

零基础一键配置黑苹果:OpCore-Simplify智能工具让复杂变简单

零基础一键配置黑苹果&#xff1a;OpCore-Simplify智能工具让复杂变简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置时面对满屏代…...

Zotero终极指南:高效文献管理的开源解决方案

Zotero终极指南&#xff1a;高效文献管理的开源解决方案 【免费下载链接】zotero Zotero is a free, easy-to-use tool to help you collect, organize, annotate, cite, and share your research sources. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero Zotero是…...