设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
1.策略模式
- 好处:动态切换算法或行为
- 场景:实现同一功能用到不同的算法时
- 和简单工厂对比:简单工厂是通过参数创建对象,调用同一个方法(实现细节不同);策略模式是上下文切换对象,调用同一个方法(实现细节不同);前者着重创建出对象,后者着重灵活切换对象。
using System;// 01 定义通用接口
public interface IPaymentStrategy
{void Pay(decimal amount);
}// 02 写接口实现策略(这里写三个)
// 信用卡支付策略
public class CreditCardPayment : IPaymentStrategy
{public void Pay(decimal amount){Console.WriteLine($"Paid {amount:C} using Credit Card.");}
}// 支付宝支付策略
public class AlipayPayment : IPaymentStrategy
{public void Pay(decimal amount){Console.WriteLine($"Paid {amount:C} using Alipay.");}
}// 微信支付策略
public class WeChatPayment : IPaymentStrategy
{public void Pay(decimal amount){Console.WriteLine($"Paid {amount:C} using WeChat.");}
}// 03 写上下文类,用于切换策略(内置设置策略方法、执行策略方法)
public class PaymentContext
{private IPaymentStrategy _paymentStrategy;// 构造函数public PaymentContext(){}// 设置或更改支付策略public void SetPaymentStrategy(IPaymentStrategy paymentStrategy){_paymentStrategy = paymentStrategy;}// 执行支付public void ExecutePayment(decimal amount){_paymentStrategy.Pay(amount);}
}// 04 使用:构建上下文=>上下文设置策略=>上下文执行策略
class Program
{static void Main(string[] args){//构建上下文PaymentContext context = new PaymentContext();// 用户选择信用卡支付IPaymentStrategy creditCardPayment = new CreditCardPayment();context.SetPaymentStrategy(creditCardPayment);context.ExecutePayment(100.50m);// 用户更换为支付宝支付IPaymentStrategy alipayPayment = new AlipayPayment();context.SetPaymentStrategy(alipayPayment);context.ExecutePayment(200.75m);// 用户更换为微信支付IPaymentStrategy weChatPayment = new WeChatPayment();context.SetPaymentStrategy(weChatPayment);context.ExecutePayment(150.30m);}
}
2.模板方法模式
- 好处:制定灵活的算法结构,可重写某步算法实现多种算法不同实现效果(将共同的部分提取到父类中,避免了重复代码,维护简单)
- 场景:多种算法相似,相互有复用借鉴部分时
using System;namespace TemplateMethodPatternDemo
{// 01 定义一个算法框架抽象类// 抽象类,定义了制作饮料的模板方法public abstract class Beverage{// 模板方法,定义了制作饮料的固定步骤public void PrepareRecipe(){BoilWater();BrewOrSteep();PourInCup();AddCondiments();}// 固定步骤private void BoilWater(){Console.WriteLine("Boiling water...");}// 抽象方法,允许子类具体实现“冲泡”或“泡制”过程protected abstract void BrewOrSteep();private void PourInCup(){Console.WriteLine("Pouring into cup...");}// 抽象方法,允许子类实现“添加调味品”步骤protected abstract void AddCondiments();}// 02 写不同的算法,重写父类的非公共细节(这里举例两个)// 具体类:制作茶public class Tea : Beverage{// 茶的泡制过程protected override void BrewOrSteep(){Console.WriteLine("Steeping the tea...");}// 添加调味品:茶通常添加柠檬protected override void AddCondiments(){Console.WriteLine("Adding lemon...");}}// 具体类:制作咖啡public class Coffee : Beverage{// 咖啡的冲泡过程protected override void BrewOrSteep(){Console.WriteLine("Brewing the coffee...");}// 添加调味品:咖啡通常添加糖和牛奶protected override void AddCondiments(){Console.WriteLine("Adding sugar and milk...");}}// 03 根据不同对象调用,实现不一样的算法// 客户端代码class Program{static void Main(string[] args){Console.WriteLine("Making Tea...");Beverage tea = new Tea();tea.PrepareRecipe(); // 调用模板方法Console.WriteLine();Console.WriteLine("Making Coffee...");Beverage coffee = new Coffee();coffee.PrepareRecipe(); // 调用模板方法}}
}
3.责任链模式
- 好处:可动态调整处理链(增加或减少角色)、请求处理的责任分散(易维护)、可复用性强
- 用途:流程审批等(C#中switch不加break是不被允许的,因此这个设计模式很有意义)
using System;namespace ResponsibilityChainDemo
{// 审批任务类 (实体定义,是逐层传递的对象)public class Task{public double Amount { get; set; } // 金额,决定需要多少审批层级}// 01 写责任链基类(关系链设定方法、各角色职责抽象方法)// 审批人基类public abstract class Approver{protected Approver _NextApprover;public void SetNextApprover(Approver nextApprover){_NextApprover = nextApprover;}public abstract void Approve(Task task);}// 02 写各责任链角色类(继承责任链基类)的抽象方法的实现// 具体审批人:部门经理public class DepartmentManager : Approver{public override void Approve(Task task){if (task.Amount <= 5000){Console.WriteLine("部门经理审批通过: " + task.Amount);}else if (_NextApprover != null){Console.WriteLine("部门经理已审批,传递给下一层审批人.");_NextApprover.Approve(task);}}}// 具体审批人:总经理public class GeneralManager : Approver{public override void Approve(Task task){if (task.Amount <= 10000){Console.WriteLine("总经理审批通过: " + task.Amount);}else if (_NextApprover != null){Console.WriteLine("总经理已审批,传递给下一层审批人.");_NextApprover.Approve(task);}}}// 具体审批人:CEOpublic class CEO : Approver{public override void Approve(Task task){if (task.Amount > 10000){Console.WriteLine("CEO审批通过: " + task.Amount);}}}//03 责任链的使用class Program{static void Main(string[] args){// 创建角色Approver departmentManager = new DepartmentManager();Approver generalManager = new GeneralManager();Approver ceo = new CEO();// 设定角色位置(从底层到高层,依次设置)departmentManager.SetNextApprover(generalManager);generalManager.SetNextApprover(ceo);// 调用责任链方法Task task = new Task() { Amount = 12000 };departmentManager.Approve(task);}}
}
责任链的设定可以通过递归方式实现,写起来效果更好!这里展示的是最简单的demo。

相关文章:
设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
1.策略模式 好处:动态切换算法或行为场景:实现同一功能用到不同的算法时和简单工厂对比:简单工厂是通过参数创建对象,调用同一个方法(实现细节不同);策略模式是上下文切换对象,调用…...
C# 多线程 Task TPL任务并行
先总结一下 之前发展过程的要点 1: 为了保证多线程正确顺序执行 线程同步 2: 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...
【matlab】matlab知识点及HTTP、TCP通信
1、矩阵运算 点乘:对于两个同维度的向量,点乘结果是这两个向量对应分量的乘积之和。 点除:是指对两个数组的对应元素进行除法运算。 点幂:表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…...
kalilinux - msf和永恒之蓝漏洞
Kali最强渗透工具 - metasploit metasploit是什么? msf是一款开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行的sheelcode,并持续保持更新。 具体操作 1、先切换到root用户,使用msfdb init命令初始化metaspl…...
网络安全测评质量管理与标准解读
大家读完觉得有帮助记得关注和点赞!!! 注意说明 刚开始写过一些比较专业的分享,较多粉丝反应看不懂,本次通过大众的通俗易懂的词汇先了解概念然后再分享规范和详细的技术原理 一、网络安全测评质量管理 网络安全测…...
Cesium根据地图的缩放zoom实现不同级别下geojson行政边界的对应展示
实现效果: 随着地图的缩放,展示对应缩放级别下的行政边界。 准备数据: 1.国家行政边界数据 (country.json) 2.省级行政边界数据 (province.json) 3.市级行政边界数据(city.json&…...
Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】
目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类(人) 2.2.2文件类型和访问权限(事物属性) 2.2.3文件权限值的表示方法 字符…...
深入剖析 Wireshark:网络协议分析的得力工具
在网络技术的广阔领域中,网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具,在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...
【AIGC】SYNCAMMASTER:多视角多像机的视频生成
标题:SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页:https://jianhongbai.github.io/SynCamMaster/ 代码:https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...
PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统
基于深度学习YOLOv5神经网络水果蔬菜检测识别系统,其能识别的水果蔬菜有15种,# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…...
Redisson中红锁(RedLock)的实现
一、什么是红锁 当在单点redis中实现redis锁时,一旦redis服务器宕机,则无法进行锁操作。因此会考虑将redis配置为主从结 构,但在主从结构中,数据复制是异步实现的。假设在主从结构中,master会异步将数据复制到slave中…...
小结:路由器和交换机的指令对比
路由器和交换机的指令有一定的相似性,但也有明显的区别。以下是两者指令的对比和主要差异: 相似之处 基本操作 两者都支持类似的基本管理命令,比如: 进入系统视图:system-view查看当前配置:display current…...
使用yarn命令创建Vue3项目
文章目录 1.技术栈2.创建流程2.1创建vue3项目2.2选择配置项2.3进入项目目录 3.使用Yarn启动项目3.1安装依赖3.2运行项目 1.技术栈 yarnvitevue3 2.创建流程 2.1创建vue3项目 vue create 项目名称2.2选择配置项 直接回车可选择Vue3 2.3进入项目目录 cd 项目名称默认在当前…...
Three.js+Vue3+Vite应用lil-GUI调试开发3D效果(三)
前期文章中我们完成了创建第一个场景、添加轨道控制器的功能,接下来我们继续阐述其他的功能,本篇文章中主要讲述如何应用lil-GUI调试开发3D效果,在开始具体流程和步骤之前,请先查看之前的内容,因为该功能必须在前期内容…...
K8S集群常用命令
1,查看pod kubectl get pods -A 查看所有的pod kubectl get pods 这个只查看namespace为default下的pod,也就是只查看默认命名空间下的pod kubectl get pod -A -o wide 查看所有的pod,并且放出的信息更全(包含了pod的ip࿰…...
【优先算法】滑动窗口--(结合例题讲解解题思路)(C++)
目录 1. 例题1:最大连续1的个数 1.1 解题思路 1.2代码实现 1.3 错误示范如下:我最开始写了一种,但是解答错误,请看,给大家做个参考 2. 将 x 减到 0 的最小操作数 2.1解题思路 2.2代码实现 1. 例题1ÿ…...
mayavi -> python 3D可视化工具Mayavi的安装
前言 Mayavi是一个基于VTK(Visualization Toolkit)的科学计算和可视化工具,主要用于数据可视化和科学计算领域。 它提供了一系列的高级可视化工具,包括2D和3D图形、表面和体积渲染、流场可视化等。Mayavi可以通过Python脚本进行调…...
【C++】B2112 石头剪子布
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述游戏规则:输入格式:输出格式:输入输出样例:解题分析与实现 💯我的做法实现逻辑优点与不足 💯…...
【Vue】vue3 video 保存视频进度,每次进入加载上次的视频进度
使用 localStorage 存储每个视频的播放进度在组件加载时恢复上次的播放进度在视频播放过程中实时保存进度在组件卸载前保存最终进度使用 timeupdate 事件来监听视频播放进度的变化 在模板中为视频元素添加事件监听: <videoloopautoplaycontrols:id"video_…...
C# 25Dpoint
C# 25Dpoint ,做一个备份 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace _25Dpoint {public partial cl…...
解锁Claude无限潜能:技能生态系统的构建艺术
解锁Claude无限潜能:技能生态系统的构建艺术 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-claude-s…...
YOLOv8与SenseVoice-Small的多模态安防监控系统设计
YOLOv8与SenseVoice-Small的多模态安防监控系统设计 1. 系统设计背景与价值 在现代安防监控领域,单纯依靠视频分析已经无法满足复杂场景下的安全需求。传统的监控系统往往需要人工实时监控,不仅效率低下,而且容易遗漏关键信息。特别是在夜间…...
终极B站界面美化指南:如何用BewlyBewly插件快速打造个性化体验
终极B站界面美化指南:如何用BewlyBewly插件快速打造个性化体验 【免费下载链接】BewlyBewly Just make a few small changes to your Bilibili homepage. (English | 简体中文 | 正體中文 | 廣東話) 项目地址: https://gitcode.com/gh_mirrors/be/BewlyBewly …...
深耕纪实创作 AVG Media 以专业能力赋能纪录片产业发展
在全球内容产业快速迭代的当下,纪录片凭借真实的叙事力量、深厚的人文价值与多元的传播场景,成为内容领域中兼具艺术价值与商业价值的重要载体。国内纪录片行业历经多年发展,形成了多元主体参与、创作方向细分、国际合作深化的行业格局&#…...
AutoDL部署大模型后,除了Chat:手把手教你用本地API接口玩转文档总结、代码生成和智能客服
AutoDL部署大模型后,除了Chat:手把手教你用本地API接口玩转文档总结、代码生成和智能客服 当你已经在AutoDL上成功部署了大语言模型,并验证了基础的聊天功能后,是否思考过如何将这些能力真正融入日常工作流?本文将带你…...
RK3568交叉编译环境搭建:ARM官方GCC 8.3与Linaro版本到底怎么选?我的踩坑与选择心得
RK3568交叉编译环境搭建:ARM官方GCC 8.3与Linaro版本深度对比与实战选择指南 在嵌入式开发领域,交叉编译环境的搭建往往是项目启动的第一道门槛。对于RK3568这样的高性能ARM处理器,选择合适的交叉编译器不仅关系到开发效率,更直接…...
什么是焦糖布丁理论?用 JTBD 做软件产品设计的四步法
“焦糖布丁理论”其实是对 Jobs to Be Done(JTBD,待办任务理论) 的一种本土化、形象化的称呼,源自哈佛商学院教授 克莱顿克里斯坦森(Clay Christensen) 在其著作《与运气竞争》(Competing Again…...
在模具设计领域,结构受压变形分析就像给钢铁骨架做“压力测试“。COMSOL的稳态研究模块能快速完成这类强度验证,但实际操作中有几个魔鬼细节需要特别注意
用comsol软件进行结构的受压变形分析,计算结构受压时应力分布及应变情况,预测模具的强度是否符合要求。 模型采用装配体,可以使用稳态研究,加快计算速度,在各零件接触的面设置接触对,对顶针施加位移&#x…...
Element UI表格样式改造避坑指南:透明化后文字看不清、边框错位怎么办?
Element UI表格透明化实战:解决文字模糊与样式错位的专业方案 当我们在Vue项目中采用Element UI的el-table组件实现透明化效果时,经常会遇到一些棘手的样式问题。本文将深入分析四个典型场景的成因,并提供经过实战检验的解决方案。 1. 透明背…...
优化算法中的‘0.618’魔法:黄金分割法为何是工程优化的首选入门工具?
黄金分割法:从古希腊美学到现代工程优化的优雅解决方案 在工程优化领域,算法选择往往让初学者感到困惑。面对梯度下降、牛顿法等复杂方法,有一种源自公元前300年的数学比例——黄金分割比(0.618),却成为了…...
