23种设计模式中的策略模式

embedded/2025/3/31 10:29:11/

策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。

策略模式:Strategy。指的是,定义了一组算法,并将每个算法封装在独立的类中。然后在运行的时候,可以灵活的选择其中的一个算法。

在这里我们根据案例来具体学习策略模式。以下是代码示例及知识点详解。

我们以去餐厅吃饭,选择不同的支付方式为例,支付宝支付、信用卡支付、现金支付,这些就可以作为策略实现。

先定义支付策略。

// 支付策略接口
public interface PaymentStrategy {void pay(double amount);
}

实现信用卡支付策略。

// 信用卡支付
public class CreditCardPayment implements PaymentStrategy {private String cardNumber;private String name;public CreditCardPayment(String cardNumber, String name) {this.cardNumber = cardNumber;this.name = name;}@Overridepublic void pay(double amount) {System.out.println(amount + "元通过信用卡支付,卡号:" + cardNumber + ",持卡人:" + name);}
}

实现支付宝支付策略。

// 支付宝支付
public class AlipayPayment implements PaymentStrategy {private String account;public AlipayPayment(String account) {this.account = account;}@Overridepublic void pay(double amount) {System.out.println(amount + "元通过支付宝支付,账户:" + account);}
}

实现现金支付策略。

// 现金支付
public class CashPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println(amount + "元现金支付,收款成功");}
}

创建上下文策略类。

// 购物车/订单类(上下文)
public class ShoppingCart {private PaymentStrategy paymentStrategy;// 设置支付策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 结账public void checkout(double amount) {paymentStrategy.pay(amount);}
}

执行程序,测试结果。

public class StrategyPatternDemo {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 选择信用卡支付cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012", "张三"));cart.checkout(100.50);// 切换为支付宝支付cart.setPaymentStrategy(new AlipayPayment("zhangsan@alipay.com"));cart.checkout(200.75);// 切换为现金支付cart.setPaymentStrategy(new CashPayment());cart.checkout(50.25);}
}

策略模式的核心思想:在一个计算方法中,把容易变化的算法抽象出来作为策略参数传进去,这样就可以实现动态选择不同的算法,使得新增策略不必修改原有逻辑。

总结

策略模式允许调用方选择一个算法实现,从而通过不同策略实现不同的计算结果。

客户端代码不需要知道具体的算法细节,而是通过调用环境类来使用所选择的策略。

扩展策略,不需要修改现有逻辑。


http://www.ppmy.cn/embedded/176553.html

相关文章

第四章 表单(2)- 输入组件

在 Blazor 框架中,微软对 HTML 输入元素进行了封装,称为输入组件。使用输入组件相较于原生 HTML 输入元素,在编码和安全性方面具有显著优势。 输入组件简介 Blazor框架提供了用于接收和验证用户输入的内置输入组件,这些组件可以…

vue java 实现大地图切片上传

文章目录 一、项目背景二、页面三、代码1.前端2.mock-i18n.js文件3.xx.js文件定义方法4.配置文件 application.properties5.后端方法 四、易错点易错点1:前端要进行分片切割,然后再分片上传。易错点2:后端配置文件要配置。易错点3&#xff1a…

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网,将我们与世界的每一个角落紧密相连。然而,当某些与自己名字相关的资料不再希望被公众轻易检索到时,如何在百度搜索中有效“隐身”,成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…

蓝桥杯,冬奥大抽奖

在日常的网页开发中,抽奖功能是一种常见的交互设计,它可以增加用户的参与感和趣味性。今天,我将分享一个简单的抽奖转盘实现,它使用了HTML、CSS和JavaScript,非常适合初学者学习和理解前端开发的基本概念。 一、项目背…

中间件框架漏洞攻略

中间件(英语:Middleware)是提供系统软件和应⽤软件之间连接的软件,以便于软件各部件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是:将应⽤程序运⾏环境与操作系统隔离,从⽽实…

Unity Animation的其中一种运用方式

Animation是Unity的旧的动画系统,先说目的,其使用是为了在UI中播放动效,并且在动效播放结束后接自定义事件而设计的 设计的关键点在于,这个脚本不是通过Animation直接播放动画片段,而是通过修改AnimationState的nor…

从零构建大语言模型全栈开发指南:第一部分:数学与理论基础-1.2.2Transformer的突破性设计:自注意力机制与位置编码

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2.2 Transformer的突破性设计:自注意力机制与位置编码1. 自注意力机制:全局依赖建模的数学革命1.1 自注意力机制的核心原理1.2 多头注意力:多视角特征融合2. `位置编码:序列顺序的数学表达`2.1 绝…

《Python全栈开发》第12课:RESTful API设计 - 构建现代化接口

🌟 课程目标 理解REST设计原则掌握Flask-RESTful开发实现JWT认证接口构建标准化API文档一、REST是什么?(餐厅点餐系统比喻) 1.1 REST核心原则 #mermaid-svg-0rLbveAhUdJCLKTy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;…