策略模式的理解和实践

        在软件开发中,我们经常遇到需要在不同算法之间进行选择的情况。这些算法可能实现相同的功能,但使用不同的方法或逻辑。为了增强代码的可维护性和可扩展性,我们可以使用设计模式来优化这些算法的实现和管理。策略模式(Strategy Pattern)正是这样一种设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而独立变化,从而提高了代码的灵活性和可复用性。

 

一、策略模式的定义

        策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。

        策略模式的结构通常包括以下几个角色:

  1. 策略接口(Strategy):定义了一个公共接口,各种算法以不同的方式实现该接口。
  2. 具体策略(Concrete Strategy):实现了策略接口,具体实现了某种算法。
  3. 上下文(Context):持有一个策略对象的引用,在客户端调用上下文对象的操作时,上下文对象会把请求委托给策略对象。

二、策略模式的理解

        策略模式的核心思想是将算法家族作为一系列独立的类,并使它们可以互换。这样,算法的变化就不会影响到使用算法的客户。

  1. 封装算法:策略模式将算法封装在独立的类中,使得它们可以互换。
  2. 解耦算法与客户端:策略模式将算法与客户端代码解耦,使得客户端代码可以独立于算法的变化。
  3. 扩展性:通过添加新的策略类,可以很容易地扩展系统的功能,而不需要修改现有的代码。

三、策略模式的实践

        下面,我们通过一个简单的例子来演示策略模式的应用。假设我们有一个电子商务系统,需要根据不同的折扣策略来计算商品的价格。

1. 定义策略接口

        首先,我们定义一个策略接口 DiscountStrategy,该接口包含一个计算折扣价格的方法 calculateDiscountedPrice

public interface DiscountStrategy {double calculateDiscountedPrice(double originalPrice);
}


2. 实现具体策略

        接下来,我们实现几个具体的策略类,这些类实现了 DiscountStrategy 接口,并提供了不同的折扣算法。

public class NoDiscountStrategy implements DiscountStrategy {@Overridepublic double calculateDiscountedPrice(double originalPrice) {return originalPrice;}
}public class PercentageDiscountStrategy implements DiscountStrategy {private double percentage;public PercentageDiscountStrategy(double percentage) {this.percentage = percentage;}@Overridepublic double calculateDiscountedPrice(double originalPrice) {return originalPrice * (1 - percentage / 100);}
}public class FixedAmountDiscountStrategy implements DiscountStrategy {private double fixedAmount;public FixedAmountDiscountStrategy(double fixedAmount) {this.fixedAmount = fixedAmount;}@Overridepublic double calculateDiscountedPrice(double originalPrice) {return originalPrice - fixedAmount;}
}


3. 定义上下文类

        然后,我们定义一个上下文类 ShoppingCart,该类持有一个 DiscountStrategy 对象的引用,并在计算总价时调用该策略对象的方法。

import java.util.ArrayList;
import java.util.List;public class ShoppingCart {private List<Item> items;private DiscountStrategy discountStrategy;public ShoppingCart(DiscountStrategy discountStrategy) {this.items = new ArrayList<>();this.discountStrategy = discountStrategy;}public void addItem(Item item) {items.add(item);}public double calculateTotalPrice() {double totalOriginalPrice = 0;for (Item item : items) {totalOriginalPrice += item.getPrice() * item.getQuantity();}return discountStrategy.calculateDiscountedPrice(totalOriginalPrice);}// 内部类表示商品public static class Item {private String name;private double price;private int quantity;public Item(String name, double price, int quantity) {this.name = name;this.price = price;this.quantity = quantity;}public String getName() {return name;}public double getPrice() {return price;}public int getQuantity() {return quantity;}}
}


4. 客户端代码

        最后,我们编写客户端代码来测试策略模式的使用。

public class Main {public static void main(String[] args) {// 创建一个购物车,并设置不打折策略ShoppingCart cart = new ShoppingCart(new NoDiscountStrategy());cart.addItem(new ShoppingCart.Item("Laptop", 1200, 1));cart.addItem(new ShoppingCart.Item("Mouse", 50, 2));System.out.println("Total Price (No Discount): " + cart.calculateTotalPrice());// 创建一个购物车,并设置百分比折扣策略cart = new ShoppingCart(new PercentageDiscountStrategy(10));cart.addItem(new ShoppingCart.Item("Laptop", 1200, 1));cart.addItem(new ShoppingCart.Item("Mouse", 50, 2));System.out.println("Total Price (10% Discount): " + cart.calculateTotalPrice());// 创建一个购物车,并设置固定金额折扣策略cart = new ShoppingCart(new FixedAmountDiscountStrategy(150));cart.addItem(new ShoppingCart.Item("Laptop", 1200, 1));cart.addItem(new ShoppingCart.Item("Mouse", 50, 2));System.out.println("Total Price ($150 Discount): " + cart.calculateTotalPrice());}
}


总结

        策略模式通过将算法封装在独立的类中,并使它们可以互换,从而提高了代码的灵活性和可复用性。它使得算法的变化独立于使用算法的客户,从而降低了系统的复杂度。在实际开发中,策略模式可以应用于多种场景,如支付系统、排序算法、压缩算法等。通过策略模式,我们可以轻松地添加新的算法,而不需要修改现有的代码,从而提高了系统的可扩展性和维护性。

        希望这篇文章能够帮助你理解和实践策略模式。如果你有任何问题或建议,请随时与我联系。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在 Linux 环境下搭建 OpenLab Web 网站并实现 HTTPS 和访问控制

实验要求 综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c…

Java开发利器:IDEA的安装与使用(下)

文章目录 8. 快捷键的使用8.1 常用快捷键8.2 查看快捷键8.3 自定义快捷键8.4 使用其它平台快捷键 9. IDEA断点调试(Debug)9.1 为什么需要Debug9.2 Debug的步骤9.3 多种Debug情况介绍9.3.1 行断点9.3.2 方法断点9.3.3 字段断点9.3.4 条件断点9.3.5 异常断点9.3.6 线程调试9.3.7 …

非对称任意进制转换器(安卓)

除了正常进制转换&#xff0c;还可以输入、输出使用不同的数字符号&#xff0c;达成对数值进行加密的效果 点我下载APK安装包 使用unity开发。新建一个c#代码文件&#xff0c;把代码覆盖进去&#xff0c;再把代码文件添加给main camera即可。 using System.Collections; usin…

神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型

(一) pytorch 官网内置的网络模型 图像处理&#xff1a; Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型&#xff08;仅前向传播&#xff09;&#xff1a; 下方的网络模型图片有误&#xff0c;已做修改&#xff0c;具…

linux 系列服务器 高并发下ulimit优化文档

系统输入 ulimit -a 结果如下 解除 Linux 系统的最大进程数 要解除或提高 Linux 系统的最大进程数&#xff0c;可以修改 ulimit 设置和 /etc/security/limits.conf 文件中的限制。 临时修改 ulimit 设置 可以使用 ulimit 命令来查看和修改当前会话的最大进程数&#xff1a; 查…

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…

基于 SpringBoot 构建校园失物招领智能平台:优化校园失物处理流程

4系统设计 4.1系统概要设计 本文通过B/S结构(Browser/Server,浏览器/服务器结构)开发的该校园失物招领系统&#xff0c;B/S结构的优点很多&#xff0c;例如&#xff1a;开发容易、强的共享性、便于维护等&#xff0c;只要有网络&#xff0c;用户可以随时随地进行使用。 系统工作…

图解SSL/TLS 建立加密通道的过程

众所周知&#xff0c;HTTPS 是 HTTP 安全版&#xff0c;HTTP 的数据以明文形式传输&#xff0c;而 HTTPS 使用 SSL/TLS 协议对数据进行加密&#xff0c;确保数据在传输过程中的安全。 那么&#xff0c;HTTPS 是如何做到数据加密的呢&#xff1f;这就需要了解 SSL/TLS 协议了。 …

HTTP协议图--HTTP 工作过程

HTTP请求响应模型 HTTP通信机制是在一次完整的 HTTP 通信过程中&#xff0c;客户端与服务器之间将完成下列7个步骤&#xff1a; 建立 TCP 连接 在HTTP工作开始之前&#xff0c;客户端首先要通过网络与服务器建立连接&#xff0c;该连接是通过 TCP 来完成的&#xff0c;该协议…

BurpSuite工具-Proxy代理用法(抓包、改包、放包)

一、Burp Suite 项目管理 二、Proxy&#xff08;代理抓包模块&#xff09; 1. 简要说明 1.1. Intercept&#xff08;拦截&#xff09; 1.2. HTTP History&#xff08;HTTP 历史&#xff09; 1.3. WebSockets History&#xff08;WebSocket 历史&#xff09; 1.4. Options…

前端测试框架 jasmine 的使用

最近的项目在使用AngulaJs,对JS代码的测试问题就摆在了面前。通过对比我们选择了 Karma jasmine ,使用 Jasmine做单元测试 &#xff0c;Karma 自动化完成&#xff0c;当然了如果使用 Karma jasmine 前提是必须安装 Nodejs。 安装好 Nodejs &#xff0c;使用 npm 安装好必要…

Blender均匀放缩模型

解决办法&#xff1a; 首先选中模型&#xff0c;按下“s”键&#xff0c;如下图所示&#xff0c;此时模型根据鼠标的移动放缩 或者在按下“s”后输入数值&#xff0c;再按回车键Enter&#xff0c;模型会根据你该数值进行均匀放缩 指定放大2倍结果——

TCP/IP 协议图--计算机网络体系结构分层

计算机网络体系结构分层 计算机网络体系结构分层 不难看出&#xff0c;TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”&#xff0c;而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”

hive 行转列

行转列的常规做法是&#xff0c;group bysum(if())【或count(if())】 建表: CREATE TABLE table2 (year INT,month INT,amount DOUBLE );INSERT INTO table2 (year, month, amount) VALUES(1991, 2, 1.2),(1991, 3, 1.3),(1991, 4, 1.4),(1992, 1, 2.1),(1992, 2, 2.2),(1992…

5G Multicast/Broadcast Services(MBS)相关的Other SI都有哪些?

系统消息分为Minimum SI 和other SI&#xff0c;其中Minimum SI 包括MIB和SIB1&#xff0c;Minimum SI包含初始访问所需的基本信息和获取任何其他 SI 的信息。 而随着3GPP引入的技术越来越多&#xff0c;例如sidelink&#xff0c;NTN&#xff0c;MBS broadcast/multicast以及A…

6. 一分钟读懂“抽象工厂模式”

6.1 模式介绍 书接上文&#xff0c;工厂方法模式只能搞定单一产品族&#xff0c;遇到需要生产多个产品族时就歇菜了。于是&#xff0c;在需求的“花式鞭策”下&#xff0c;程序员们再次绷紧脑细胞&#xff0c;创造出了更强大的抽象工厂模式&#xff0c;让工厂一次性打包多个产品…

Ignis如何将Tokenization解决方案应用于RWA和实体经济

随着区块链技术的发展&#xff0c;代币化&#xff08;Tokenization&#xff09;逐渐成为连接数字经济与实体经济的重要桥梁。尤其是RWA&#xff08;真实世界资产&#xff09;的概念&#xff0c;近年来成为金融行业的热议话题。Ignis作为Jelurida公司推出的公链平台&#xff0c;…

sql删除冗余数据

工作或面试中经常能遇见一种场景题&#xff1a;删除冗余的数据&#xff0c;以下是举例介绍相应的解决办法。 举例&#xff1a; 表结构&#xff1a; 解法1&#xff1a;子查询 获取相同数据中id更小的数据项&#xff0c;再将id不属于其中的数据删除。-- 注意&#xff1a;mysql中…

mac 安装python3和配置环境变量

mac 安装python3和配置环境变量 前言怎样选择python3的版本python3的安装1、去官网下载安装包2、下载完成后直接解压,检查安装是否成功 前言 在学习python的第一步就是安装它和配置他的环境变量&#xff0c;那么选择哪个版本的python你可曾知道&#xff0c;下面就讲解怎样选择…

Springboot美食分享平台

私信我获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 Springboot美食分享平台 一、 绪论 1.1 研究意义 当今社会作为一个飞速的发展社会&#xff0c;网络已经完全渗入人们的生活&#xff0c; 网络信息已成为传播的第一大媒介&#xff0c; 可以毫不夸张…