策略模式:切换算法的灵活性

news/2025/3/16 16:09:55/

欢迎来到设计模式系列的第十二篇文章!在之前的文章中,我们已经学习了许多常用的设计模式,今天我们将介绍另一个重要的设计模式——策略模式。

策略模式简介

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装到一个独立的类中,并使它们可以相互替换。

策略模式允许客户端在运行时从多个算法中选择一个合适的算法,而不必修改代码。

为什么需要策略模式?

在软件开发中,经常会遇到需要根据不同情况选择不同算法的情况。如果使用硬编码的方式实现这些选择,代码将变得复杂且难以维护。策略模式提供了一种更优雅的方式来处理这种情况,它将每个算法封装为一个策略类,使得算法的变化不会影响到客户端代码。

策略模式的实现

为了更好地理解策略模式,让我们通过一个例子来演示其实际应用。假设我们正在开发一个电商网站,该网站有多种促销策略,如满减、打折、返现等。我们可以使用策略模式来实现这些促销策略。

首先,我们定义一个策略接口 PromotionStrategy

public interface PromotionStrategy {void applyPromotion();
}

然后,我们创建多个具体的策略类,如 DiscountPromotionStrategyFullReductionPromotionStrategyCashBackPromotionStrategy 等,它们实现了 PromotionStrategy 接口,并分别代表不同的促销策略。

public class DiscountPromotionStrategy implements PromotionStrategy {@Overridepublic void applyPromotion() {System.out.println("使用折扣策略:商品打折销售");}
}public class FullReductionPromotionStrategy implements PromotionStrategy {@Overridepublic void applyPromotion() {System.out.println("使用满减策略:满100减20");}
}public class CashBackPromotionStrategy implements PromotionStrategy {@Overridepublic void applyPromotion() {System.out.println("使用返现策略:满200返50");}
}

客户端代码可以根据需要选择不同的促销策略,而不必关心具体的算法实现:

public class Client {public static void main(String[] args) {PromotionStrategy strategy = new DiscountPromotionStrategy(); // 可以根据需要替换策略ShoppingCart shoppingCart = new ShoppingCart(strategy);shoppingCart.checkout();}
}

通过策略模式,我们可以轻松地切换不同的促销策略,而不会影响到客户端代码。

策略模式与工厂模式的结合

有时候,我们希望根据具体情况来选择合适的策略,这时可以结合工厂模式来创建策略对象。例如,我们可以定义一个策略工厂,根据客户端传入的参数来创建相应的策略对象。

public class PromotionStrategyFactory {public static PromotionStrategy createPromotionStrategy(String type) {if ("discount".equalsIgnoreCase(type)) {return new DiscountPromotionStrategy();} else if ("fullReduction".equalsIgnoreCase(type)) {return new FullReductionPromotionStrategy();} else if ("cashBack".equalsIgnoreCase(type)) {return new CashBackPromotionStrategy();}throw new IllegalArgumentException("Unsupported promotion type: " + type);}
}

这样,客户端可以通过工厂来获取策略对象,实现了策略的动态切换。

总结

策略模式是一种用于实现算法家族的设计模式,它将每个算法封装到独立的策略类中,使得这些算法可以相互替换。通过策略模式,我们可以实现算法与客户端代码的解耦,提高了代码的灵活性和可维护性。

在本篇文章中,我们介绍了策略模式的基本概念、优点以及为什么需要使用它。我们还通过一个电商促销的例子演示了策略模式的实际应用。策略模式是设计模式中的一个重要成员,掌握它可以帮助我们写出更灵活、可扩展和易维护的代码。


http://www.ppmy.cn/news/1106340.html

相关文章

leetcode分类刷题:栈(Stack)(三、下一个更大的数)

1、本次博客总结的“栈(Stack)(三、下一个更大的数)”类型具体是指寻找任一个元素的右边/左边第一个比自己大/小的元素的位置,这与栈的先入后出思想一致 2、这种题目用栈处理的算法模板往往叫做单调栈,是因…

java8-Stream流常用API

什么是 Stream Stream(流)是 Java 8 引入的一个新的抽象概念,它代表着一种处理数据的序列。简单来说,Stream 是一系列元素的集合,这些元素可以是集合、数组、I/O 资源或者其他数据源。 Stream API 提供了丰富的操作方…

seatunnel win idea 本地调试

调试FakeSource,LocalFile # Set the basic configuration of the task to be performed env {execution.parallelism 1job.mode "BATCH" }# Create a source to connect to Mongodb source {# This is a example source plugin **only for test and d…

【C++从0到王者】第二十八站:二叉搜索树的应用

文章目录 前言一、Key模型二、Key/Value模型总结 前言 二叉搜索树的在现实世界的应用很广泛,比如Key模型,Key-Value模型就是常见的两种的模型 一、Key模型 K模型:K模型即只有key作为关键码,结构中只需要存储Key即可&#xff0c…

小程序分销机制介绍,小程序二级分销功能有哪些?

为什么有越来越多的用户选择使用小程序?跟“高大上”的APP相比,小程序不仅可以减少下载安装的复杂流程,还具备操作便捷、沉淀私域数据的优势。蚓链分销小程序具备裂变二维码、实时分佣、分销身份升级、层级分佣、商品个性化佣金设定等功能&am…

(其他) 剑指 Offer 61. 扑克牌中的顺子 ——【Leetcode每日一题】

❓剑指 Offer 61. 扑克牌中的顺子 难度:简单 从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大…

草莓CDMS独创的内容分销系统 微信小说平台系统v1.0

草莓CDMS是一个采用thinkphp5.1Easywechat4.0swooleredis开发的原创内容分销系统,其特点包括简单操作、灵活后台设置、两种对接模式以及五种用户角色等。系统集成了微信开放平台扫码授权和微信公众平台手动对接的功能,并支持多种经营模式,如平…

在 Arweave 中轻松管理文件:借助 4EVERLAND 完成 Web3 前端Path Manifests的终极指南

为什么使用Path Manifests? 当在 IPFS 上发布 NFT 时,图片和元数据会被上传到 IPFS 网络以获得一个根 CID,其形式如下: ipfs://bafybeic36ik6cngu37xbzmpytuvyo7z3lyeen44clkkxq5d263zj4nkzr4 通过使用这个根 CID,每…