设计模式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。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout&#xff08;检出&#xff09;到 Pycharm中 2、推送…

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时&#xff0c;Kafka Listener 的默认行为是开始监听某个主题。但是&#xff0c;有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener&#xff0c;我们需要三种主要方法…

C++|CRC校验总结

参考&#xff1a; Vector - CAPL - CRC算法介绍 开发工具 > CRC校验工具 文章目录 简介CRC-8CRC-16CRC-32 简介 循环冗余校验&#xff08;Cyclic Redundancy Check&#xff0c;简称CRC&#xff09;是一种数据校验算法&#xff0c;广泛用于检测数据传输或存储过程中的错误。…

# c语言:数组详解一

c语言&#xff1a;数组详解一 数组数组的概念引例&#xff1a;什么是数组数组的特征&#xff1a;下标&#xff08;索引&#xff09; 常用的数组按维度划分一维数组数组的定义&#xff1a;数组元素的访问数组的初始化**案例一、斐波拉契数列&#xff1a;****案例二、冒泡排序&am…

Docker启动达梦 rman恢复

目录标题 1. 主库备份2. Docker启动备库3. 备库修改属组4. 开始恢复5. 连接数据库配置归档 & Open6. 检查数据 关于达梦数据库&#xff08;DMDBMS&#xff09;的主库备份、Docker启动备库、恢复备份以及配置归档和打开数据库的详细步骤。 1. 主库备份 # 使用达梦数据库备…

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表&#xff0c;我们会发现需要开通WPS会员才能使用合并功能&#xff1b; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢&#xff1f; 1、首先我们要看excel后缀是 .xlsx 还是 .xls &#xff1b;如果是.xlsx 那么 我们需要修改为 .xls 注…

【Python项目】个人密码本文档系统

【Python项目】个人密码本文档系统 技术简介&#xff1a;采用Python技术、Django、MYSQL数据库等实现。 系统简介&#xff1a;系统主要的功能有&#xff08;1&#xff09;新建密码本&#xff1a;用户可以创建新的密码本来记录自己的账户与密码&#xff1b; &#xff08;2&#…

《OpenCV》——模版匹配

文章目录 OpenCV——模版匹配简介模版匹配使用场景OpenCV 中模板匹配的函数参数 OpenCV——模版匹配实例导入所需库读取图片并处理图片对模版图片进行处理进行模版匹配显示模版匹配的结果注意事项 OpenCV——模版匹配简介 OpenCV 是一个非常强大的计算机视觉库&#xff0c;其中…

doc、pdf转markdown

国外的一个网站可以&#xff1a; Convert A File Word, PDF, JPG Online 这个网站免费的&#xff0c;算是非常厚道了&#xff0c;但是大文件上传多了之后会扛不住 国内的一个网站也不错&#xff1a; TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…

金融项目实战 06|Python实现接口自动化——日志、实名认证和开户接口

目录 一、日志封装及应用&#xff08;理解&#xff09; 二、认证开户接口脚本编写 1、代码编写 1️⃣api目录 2️⃣script目录 2、BeautifulSoup库 1️⃣简介及例子 2️⃣提取html数据工具封装 3、认证开户参数化 一、日志封装及应用&#xff08;理解&#xff09; &…

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…

Spring官网构建Springboot工程

注意&#xff1a;基于Idea的 Spring Initializr 快速构建 SpringBoot 工程时需要联网。 1.进入SpringBoot官网 Spring | Home 点击QUICKSTART 点击start.spring.io进入spring initializr 2.选择依赖 3.生成工程 下载好后解压用IDEAD导入即可。

计算机的错误计算(二百一十二)

摘要 利用两个大模型计算 实验表明&#xff0c;两个大模型均进行了中肯的分析。另外&#xff0c;其中一个大模型给出了 Python代码&#xff0c;运行后&#xff0c;结果中有7位错误数字&#xff1b;而一个大模型进行加减运算时出错。 例1. 计算 下面是与一个大模型的对话…

Vue+Echarts+百度地图 实现 路径规划

实现功能: 通过选择 相关调拨&#xff0c;系统自动规划 路径&#xff0c;并且以地图的形式呈现最佳路径 技术难点: 1. vue 结合使用 echarts 2.echarts 在 vue嵌入百度地图&#xff0c;并且做出路径 曲线 最终结果:

【算法】图解两个链表相交的一系列问题

问&#xff1a; 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的第一个节点&#xff1b;如果不相交&#xff0c;返回null。如果两个链表长度之和为N&#xff0c;时间复杂度请达到O(N…

Go-Zero整合Goose实现MySQL数据库版本管理

推荐阅读 【系列好文】go-zero从入门到精通&#xff08;看了就会&#xff09; 教程地址&#xff1a;https://blog.csdn.net/u011019141/article/details/139619172 Go-Zero整合Goose实现MySQL数据库版本管理的教程 在开发中&#xff0c;数据库迁移和版本管理是必不可少的工作。…

JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南

1、简述 在现代Web开发中&#xff0c;安全性尤为重要。为了确保用户的身份&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为一种轻量级且无状态的身份验证方案&#xff0c;广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…

说一说mongodb组合索引的匹配规则

一、背景 有一张1000多万条记录的大表&#xff0c;需要做归档至历史表&#xff0c;出现了大量慢查询。 查询条件是 "classroomId": {$in: ["xxx", "xxx", ..... "xxx","xxx", "xxx" ] }耗时近5秒&#xff0c;且…