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

【行为型设计模式】C#设计模式之策略模式

题目:假设你正在开发一个手机应用程序,该应用程序包含一个计算器功能。用户可以根据自己的需求选择不同的计算策略进行计算,例如加法、减法、乘法或除法。请使用策略模式设计该计算器功能,使得用户可以根据自己的选择进行相应的计算操作。请描述如何使用策略模式来设计并实现该计算器功能,并简要说明策略模式的优点和适用场景。
策略模式是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。策略模式的主要作用是将算法的定义与使用相分离,提供了一种灵活的方式来管理和应用不同的算法。策略模式的好处包括:可扩展性:通过定义抽象的策略接口,可以随时添加新的具体策略类,而不需要修改现有代码。这使得系统更加灵活,容易扩展。代码复用:使用策略模式可以将具体的算法封装到独立的策略类中,这样可以避免重复的代码逻辑,并提高代码的重用性。可维护性:由于每个策略类都是独立的,所以对于每个具体的策略类进行单独的测试和维护是比较容易的。这样可以简化代码的维护过程。解耦合:策略模式将算法的定义与使用相分离,使得客户端与具体策略类解耦,客户端只需要知道如何使用策略接口即可。这样可以减少类之间的依赖关系,提高代码的灵活性和可维护性。动态切换算法:策略模式允许在运行时根据需要动态地切换算法,而不需要修改原有代码。这使得系统能够根据不同的情况或需求灵活地使用不同的算法,提高了系统的适应性和扩展性。总的来说,策略模式提供了一种灵活、可扩展和可维护的方式来处理不同的算法或行为,并将其封装到独立的策略类中,使得系统更加灵活和易于维护。

参考代码:

class Program 
{static void Main(string[] args) {Calculator calculator = new Calculator();calculator.SetStrategy(new AdditionStrategy());Console.WriteLine("10 + 5 = " + calculator.ExecuteStrategy(10, 5));calculator.SetStrategy(new SubtractionStrategy());Console.WriteLine("10 - 5 = " + calculator.ExecuteStrategy(10, 5));calculator.SetStrategy(new MultiplicationStrategy());Console.WriteLine("10 * 5 = " + calculator.ExecuteStrategy(10, 5));calculator.SetStrategy(new DivisionStrategy());Console.WriteLine("10 / 5 = " + calculator.ExecuteStrategy(10, 5));Console.ReadLine();}
}public interface ICalculatorStrategy 
{double Calculate(double num1, double num2);
}public class AdditionStrategy : ICalculatorStrategy
{public double Calculate(double num1, double num2){return num1 + num2;}
}public class SubtractionStrategy : ICalculatorStrategy
{public double Calculate(double num1, double num2){return num1 - num2;}
}public class MultiplicationStrategy : ICalculatorStrategy
{public double Calculate(double num1, double num2){return num1 * num2;}
}public class DivisionStrategy : ICalculatorStrategy
{public double Calculate(double num1, double num2){if (num2 != 0){return num1 / num2;}else{throw new ArgumentException("除数不能为零!");}}
}public class Calculator
{private ICalculatorStrategy? _calculatorStrategy;public void SetStrategy(ICalculatorStrategy calculatorStrategy){_calculatorStrategy=calculatorStrategy;}public double ExecuteStrategy(double num1, double num2) {if (_calculatorStrategy == null){throw new InvalidOperationException("没有设置计算策略!");}return _calculatorStrategy.Calculate(num1, num2);}
}

相关文章:

【行为型设计模式】C#设计模式之策略模式

题目:假设你正在开发一个手机应用程序,该应用程序包含一个计算器功能。用户可以根据自己的需求选择不同的计算策略进行计算,例如加法、减法、乘法或除法。请使用策略模式设计该计算器功能,使得用户可以根据自己的选择进行相应的计…...

Linux Shell 编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天…...

Webstorm + Egg.js 进行断点调试

Webstorm Egg.js 进行断点调试 1、在工具栏找到编辑配置,创建已运行Node.js 应用程序的调试配置 2、debug调试配置 3、调试 4、查看断点是否起效...

Oracle-创建PDB

Oracle-创建PDB 创建PDB的方式 从PDB$SEED新建PDB克隆已存在的PDB 本地PDB克隆到同一个CDB中将远程PDB克隆到CDB中将非CDB插入或克隆到CDB中通过插拔的方式创建PDB sql 命令语法 条件 CDB必须open并且read write模式连接CDB$ROOT 用户并且具有CREATEPLUGGABLEDATABASE系统权…...

【TypeScript】交叉类型联合类型(四)

【TypeScript】交叉类型&联合类型(四) 【TypeScript】交叉类型&联合类型(四)一、简介二、交叉类型2.1 交叉类型使用的注意点2.2 基本数据类型交叉2.3 对象类型交叉 三、联合类型四、类型缩减 一、简介 TypeScript 中的交…...

数组和字符串-字符串

最长公共前缀 题意: 给多个字符串,找最长前缀 解: 暴力匹配,先按字典序排序字符串,这样长度短的优先进行匹配,所得字符串就可能偏小 适合a aa aaa aaaa这样的数据,不过对于aa aab aabc aab…...

MySQL-索引基础

文章概要 本篇文章通过几个问题来了解MySQL中索引相关的概念。平时在学习MySQL时或多或少都听说过索引的概念,但是索引到底是个什么东西,可能还不是非常的清楚。 正文 1. 什么是索引? 索引,在MySQL中也称为键(key)&#xff0c…...

CentOS中自动加载802.1q模块

CentOS中自动加载802.1q模块 要想在CentOS中自动加载内核模块,需要在/etc/sysconfig/modules/目录中增加一个脚本,在此脚本中加载所需的模块。 下面是我所用的一个名为8021q.modules的脚本,用来在我的CentOS 5.3中自动加载802.1Q模块&#…...

CSP-J2022第一轮试题

...

使用Java根据表名导出与导入Sql

前言 很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。 嗨!我是一名社交媒体增长黑客,很高兴能帮助您优化和丰富关于批量作业导出和导入…...

Elasticsearch同时使用should和must

问题及解决方法 must和should组合查询,should失效。使用must嵌套查询,将should组成的bool查询包含在其中一个must查询中。 SearchRequest request new SearchRequest(); request.indices("function_log");SearchSourceBuilder sourceBuilde…...

羽毛球热身和拉伸

1、绕场地慢跑 2、拉伸练习 拉伸动作主要有腕踝关节热身、下蹲、弓箭步压腿、后蹲压腿、腹背 具体动作可自行搜索练习 3、挥拍练习 杀球上网挥拍练习 正手挑球练习、反手挑球练习 4、拉伸 脚踝:一脚支持,另一脚拇指撑地正反向来回几圈转动脚踝&#…...

使用 Vue 实现页面访问拦截

使用 Vue 实现页面访问拦截 在现代的 Web 应用程序中,页面访问拦截是非常重要的一个方面。它可以用于确保用户只能访问他们有权限的页面,提高应用程序的安全性和用户体验。本篇博文将介绍如何使用 Vue 框架来实现页面访问拦截的功能。 文章目录 使用 Vu…...

使用webpack建立React+TS项目

之前写过类似的文章,这次看到一本新书里也介绍了这个知识点,故尝试之。 Refer: 《Learn React With TypeScript - A Beginners Guide To Reactive Web Development With React 18 and TypeScript》chapter3 Creating a project with webpack 1.先建立一…...

法律监督大数据平台有什么作用?

大数据赋能时代法律监督,构建法律行业领域大数据监督模型。法律监督大数据研判系统助力检察机关以社会公正为核心价值追求,对执法不严、司法不公“零容忍”,强化对诉讼活动的法律监督,坚决维护法律尊严,坚决捍卫公平正…...

根据制定的长度切割list值

88、根据制定的长度切割list值 依赖&#xff0c;谷歌开源的工具类库&#xff0c;非常的强大 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version> </dependency>其…...

AES加密(1):AES基础知识和计算过程

从产品代码的安全角度考虑&#xff0c;我们需要对代码、数据进行加密。加密的算法有很多种&#xff0c;基于速度考虑&#xff0c;我们一般使用对称加密算法&#xff0c;其中有一种常见的对称加密算法&#xff1a;AES(Advanced Encryption Standard)。在一些高端的MCU&#xff0…...

Nginx启动报错- Failed to start The nginx HTTP and reverse proxy server

根据日志&#xff0c;仍然出现 “bind() to 0.0.0.0:8888 failed (13: Permission denied)” 错误。这意味着 Nginx 仍然无法绑定到 8888 端口&#xff0c;即使使用 root 权限。 请执行以下操作来进一步排查问题&#xff1a; 确保没有其他进程占用 8888 端口&#xff1a;使用以…...

五、web应用程序技术——web功能

文章目录 一、服务器端功能1.1 SQL1.2 XML1.3 web服务 二、客户端功能2.1 HTML2.2 超链接2.3 表单2.4 CSS2.5 JavaScript2.6 文档对象模型2.7 Ajax2.8 JSON2.9 同源策略2.10浏览器拓展技术 一、服务器端功能 早期的web站点由各种静态资源组成&#xff0c;如HTML页面与图片。当用…...

AutoDL服务器的镜像版本太高,配置python3.7 tensorflow1.15版本的框架的步骤

1.选择一个实例&#xff0c;进入后端界面 2. 更新bashrc中的环境变量 conda init bash && source /root/.bashrc查看虚拟环境 conda info --envs可以看到此时有一个base的虚拟环境 但是它的python版本为3.8.10&#xff0c;无法安装tensorflow1.15,所以我们要创建一个…...

Windows 正版系统安装(重装) - Win10(微星主板 - MSI)

一、启动盘制作 本文章为正版 Windows 安装系统流程&#xff0c;安装版本为 Windows 10 家庭版 官方免费版本&#xff01; Mac 制作 Win10 启动盘&#xff08;不推荐&#xff0c;因为 U盘 无法格式化为 NTFS&#xff0c;以前是可以选择 Microsoft NTFS 格式的&#xff0c;但是…...

Windows用户必看:3分钟免费获取macOS同款鼠标指针的终极指南

Windows用户必看&#xff1a;3分钟免费获取macOS同款鼠标指针的终极指南 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/m…...

保姆级教程:Qwen3-ASR-0.6B语音识别模型5分钟快速部署与使用

保姆级教程&#xff1a;Qwen3-ASR-0.6B语音识别模型5分钟快速部署与使用 1. 快速了解Qwen3-ASR-0.6B Qwen3-ASR-0.6B是一款轻量级但功能强大的语音识别模型&#xff0c;由通义千问团队开发。它最吸引人的特点是支持52种语言和方言的识别&#xff0c;包括中文普通话、英语、粤…...

Nunchaku-flux-1-dev实现Transformer模型快速部署:一键配置方案

Nunchaku-flux-1-dev实现Transformer模型快速部署&#xff1a;一键配置方案 1. 开篇&#xff1a;为什么选择这个方案 如果你正在寻找一个简单高效的Transformer模型部署方案&#xff0c;Nunchaku-flux-1-dev可能会让你眼前一亮。这个方案最大的特点就是简单&#xff0c;不需要…...

大语言模型作为语种民族文明压缩镜像的映射特性分析

摘要 大语言模型通过预测下一个词学习语言概率模式的本质&#xff0c;使其成为其所训练语料库的统计压缩体。这种本质决定了模型能够映射特定语种民族或文明的深层文化偏好&#xff0c;成为一个独特的“压缩镜像”。该镜像并非对文明的完整复制&#xff0c;而是基于海量文本数据…...

代码即提示词,测试即推理验证:AI原生研发流水线落地手册(附GitHub千星开源工具链清单)

第一章&#xff1a;从传统开发到AI原生&#xff1a;软件研发范式革命 2026奇点智能技术大会(https://ml-summit.org) 软件研发正经历一场静默却深刻的范式迁移——从以人类编码为中心、面向确定性逻辑的工程实践&#xff0c;转向以提示驱动、模型协同、反馈闭环为特征的AI原生…...

GLM-4.1V-9B-Base作品分享:中文视觉理解SOTA级效果的可复现截图

GLM-4.1V-9B-Base作品分享&#xff1a;中文视觉理解SOTA级效果的可复现截图 1. 模型介绍 GLM-4.1V-9B-Base是智谱最新开源的视觉多模态理解模型&#xff0c;在中文视觉理解任务上达到了SOTA(State-of-the-art)水平。这个模型特别擅长处理与中文相关的视觉任务&#xff0c;能够…...

Java字符串相似度计算:10大算法库终极指南

Java字符串相似度计算&#xff1a;10大算法库终极指南 【免费下载链接】java-string-similarity Implementation of various string similarity and distance algorithms: Levenshtein, Jaro-winkler, n-Gram, Q-Gram, Jaccard index, Longest Common Subsequence edit distanc…...

大模型学习-python学习Day5

一.函数函数是带名字的代码块&#xff0c;用于完成具体的任务&#xff0c;可重复使用&#xff0c;当需要在程序中多次执行同一项任务时&#xff0c;无须反复编写完成该任务的代码&#xff0c;只需要调用执行该任务的函数&#xff0c;让python运行其中的代码即可。python中的函数…...

东南亚电商支付方式有哪些?2026最新整

东南亚电商支付方式以电子钱包、信用卡支付、实时转账和国家统一二维码为核心。印尼常用GoPay、DANA、QRIS&#xff0c;泰国 以PromptPay和TrueMoney为主&#xff0c;马来西亚主流是DuitNow和TouchnGo&#xff0c;新加坡则以PayNow和GrabPay覆盖核心场景。 对于独立站卖家而言…...