策略模式适用场景与具体实例解析

策略模式在多种场合下都能发挥其优势,尤其在需要根据不同条件或策略选择不同算法的场景中。下面是几个具体的适用场景及其对应的实例,以帮助进一步理解策略模式的实际应用。

1. 支付方式选择

在电子商务网站中,用户可以选择多种支付方式,如信用卡、PayPal、Apple Pay等。每种支付方式的处理流程可能不同,使用策略模式可以将这些支付方式抽象为策略,允许用户在运行时选择最合适的支付方式。

 

Java

深色版本

1// 策略接口
2public interface PaymentStrategy {
3    void pay(double amount);
4}
5
6// 具体策略:信用卡支付
7public class CreditCardPayment implements PaymentStrategy {
8    @Override
9    public void pay(double amount) {
10        // 处理信用卡支付逻辑
11        System.out.println("Paying $" + amount + " with Credit Card");
12    }
13}
14
15// 具体策略:PayPal支付
16public class PayPalPayment implements PaymentStrategy {
17    @Override
18    public void pay(double amount) {
19        // 处理PayPal支付逻辑
20        System.out.println("Paying $" + amount + " with PayPal");
21    }
22}
23
24// 上下文:购物车
25public class ShoppingCart {
26    private PaymentStrategy strategy;
27
28    public ShoppingCart(PaymentStrategy strategy) {
29        this.strategy = strategy;
30    }
31
32    public void checkout(double amount) {
33        strategy.pay(amount);
34    }
35}
36
37// 客户端代码
38public class Client {
39    public static void main(String[] args) {
40        ShoppingCart cart = new ShoppingCart(new CreditCardPayment());
41        cart.checkout(100.0); // 输出:Paying $100.0 with Credit Card
42        
43        cart = new ShoppingCart(new PayPalPayment());
44        cart.checkout(200.0); // 输出:Paying $200.0 with PayPal
45    }
46}
2. 排序算法选择

在数据处理中,不同的排序算法适用于不同的数据类型和大小。策略模式可以用来在运行时选择最适合当前数据集的排序算法。

 

Java

深色版本

1// 策略接口
2public interface SortStrategy {
3    void sort(int[] array);
4}
5
6// 具体策略:冒泡排序
7public class BubbleSort implements SortStrategy {
8    @Override
9    public void sort(int[] array) {
10        // 实现冒泡排序逻辑
11        System.out.println("Sorting with Bubble Sort");
12    }
13}
14
15// 具体策略:快速排序
16public class QuickSort implements SortStrategy {
17    @Override
18    public void sort(int[] array) {
19        // 实现快速排序逻辑
20        System.out.println("Sorting with Quick Sort");
21    }
22}
23
24// 上下文:数据处理器
25public class DataProcessor {
26    private SortStrategy strategy;
27
28    public DataProcessor(SortStrategy strategy) {
29        this.strategy = strategy;
30    }
31
32    public void process(int[] array) {
33        strategy.sort(array);
34    }
35}
36
37// 客户端代码
38public class Client {
39    public static void main(String[] args) {
40        DataProcessor processor = new DataProcessor(new BubbleSort());
41        processor.process(new int[]{5, 3, 2, 4, 1}); // 输出:Sorting with Bubble Sort
42        
43        processor = new DataProcessor(new QuickSort());
44        processor.process(new int[]{5, 3, 2, 4, 1}); // 输出:Sorting with Quick Sort
45    }
46}
3. 优惠策略选择

在营销活动中,商家可能提供多种优惠策略,如满减、打折、积分抵扣等。策略模式可以让商家根据商品类别或用户等级选择最优的优惠策略。

 

Java

深色版本

1// 策略接口
2public interface PromotionStrategy {
3    double applyPromotion(double price);
4}
5
6// 具体策略:满减优惠
7public class CashBackPromotion implements PromotionStrategy {
8    private final double threshold;
9    private final double discount;
10
11    public CashBackPromotion(double threshold, double discount) {
12        this.threshold = threshold;
13        this.discount = discount;
14    }
15
16    @Override
17    public double applyPromotion(double price) {
18        if (price >= threshold) {
19            return price - discount;
20        }
21        return price;
22    }
23}
24
25// 具体策略:打折优惠
26public class DiscountPromotion implements PromotionStrategy {
27    private final double discountRate;
28
29    public DiscountPromotion(double discountRate) {
30        this.discountRate = discountRate;
31    }
32
33    @Override
34    public double applyPromotion(double price) {
35        return price * (1 - discountRate);
36    }
37}
38
39// 上下文:订单处理器
40public class OrderProcessor {
41    private PromotionStrategy strategy;
42
43    public OrderProcessor(PromotionStrategy strategy) {
44        this.strategy = strategy;
45    }
46
47    public double processOrder(double price) {
48        return strategy.applyPromotion(price);
49    }
50}
51
52// 客户端代码
53public class Client {
54    public static void main(String[] args) {
55        OrderProcessor processor = new OrderProcessor(new CashBackPromotion(100, 20));
56        System.out.println(processor.processOrder(150)); // 输出:130.0
57        
58        processor = new OrderProcessor(new DiscountPromotion(0.1));
59        System.out.println(processor.processOrder(100)); // 输出:90.0
60    }
61}
结论

策略模式通过将算法封装在独立的策略类中,实现了算法的解耦和动态选择。它提高了代码的灵活性和可维护性,特别是在需要频繁切换或扩展算法的场景中。通过上述实例,我们可以看到策略模式在不同领域中的实际应用,以及它如何简化复杂系统的管理和升级。

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

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

相关文章

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…

LLM上下文长度扩展方案:YaRN

文章目录 I. 前言II. NTK-by-partsIII. YaRNIV. Dynamic NTK 题目: YaRN: Efficient Context Window Extension of Large Language Models 论文地址: YaRN: Efficient Context Window Extension of Large Language Models I. 前言 在之前的两篇文章中分…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

【工具使用】adb下载和配置

【工具使用】adb下载和配置 一,简介二,操作步骤2.1 Bing搜索adb2.2 下载adb工具2.3 添加路径到环境变量 三,效果验证 一,简介 本文主要介绍如何下载adb并安装使用,供参考。 此时打开cmd,输入adb 会提示&am…

计算机网络——网络层(概念及IP地址划分)

目录 网络层概念 网络层向上层提供的两种服务 虚电路 网络提供数据报服务 虚电路服务与数据报服务的对比 网络层的两个层面 分组传送到路由器的运作 对网络层进行分层 网际协议IP 虚拟互联网络 IP地址 IP地址及其表示方法 IP地址的计算方式 IP地址的结构 …

每日一练,java

目录 描述示例 总结 描述 题目来自牛客网 •输入一个字符串,请按长度为8拆分每个输入字符串并进行输出; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 输入描述: 连续输入字符串(每个字符串长度小于等于100) 输…

用Java连接MySQL数据库的总结

✨个人主页: 不漫游-CSDN博客 前言 在日常开发中,使用Java连接MySQL数据库是一个常见的任务,涉及多个步骤。接着我就带着大家细细看来~ 一.下载.jar 包文件 1.什么是.jar 文件 通俗点讲就是一个压缩包,不过里面存放的都是由Java代…

Docker基本管理1

Docker 概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…

1.27、基于径向基神经网络的曲线拟合(matlab)

1、基于径向基神经网络的曲线拟合简介及原理 1)原理简介 基于径向基神经网络(Radial Basis Function Neural Network, RBFNN)的曲线拟合是一种常用的非线性拟合方法,通过在输入空间中使用径向基函数对数据进行处理,实现对非线性关系的拟合。 RBFNN的基本原理是将输入空…

笔记 2 :linux 0.11 中的重要的全局变量 (a)

通过对全局变量的了解,也有助于了解整个代码的逻辑。就跟学习类一样,了解类有哪些成员变量,也有助于了解类的成员函数的功能。 以下介绍全局变量的顺序,符合这两本书的讲解顺序: (1)内存初始化相…

Kafka 高并发设计之数据压缩与批量消息处理

《Kafka 高性能架构设计 7 大秘诀》专栏第 6 章。 压缩,是一种用时间换空间的 trade-off 思想,用 CPU 的时间去换磁盘或者网络 I/O 传输量,用较小的 CPU 开销来换取更具性价比的磁盘占用和更少的网络 I/O 传输。 Kafka 是一个高吞吐量、可扩展…

多文件编程:c/c++分文件写法(入门)

前言 一个 C 项目通常会采取 声明与定义分离 的方式进行编写,其基本遵循:头文件中写声明,源文件中写定义。 此外,为了区分头文件与源文件,会采用不同的文件后缀: .h: 头文件 .cpp: 源文件 (当然还有其他的…

写真图片视频打赏系统源码全开源无加密

这是一款开源的写真图片及视频打赏系统源码,顾名思义他可以做写真图片打赏站也可以做视频打赏站,支付对接了易支付,拥有独立代理后台,全部源码无加密,另外也可以配合付费进群使用。支付扣量、域名防洪这些基本的就不介…

小白如何学习软件开发

众所周知,软件开发技术是IT技术的核心技术,也是从事IT职业的技术学习首选,因此不少人会去学习,下面我给大家分享关于软件开发学习方法有哪些,欢迎阅读! 1、明确学习目的 学习编程能锻炼思维,使我们的逻辑思…

openlayers WebGL裁剪图层,双图层拼接显示

本篇介绍一下使用openlayers WebGL裁剪图层,双图层拼接显示 1 需求 WebGL裁剪图层,双图层拼接显示 2 分析 图层prerender和postrender事件的使用 WebGL scissor方法的使用 scissor方法指定了一个裁剪区域,用来将绘图区域限制在其限定的盒…

【LeetCode】2187. 完成旅途的最少时间

1. 题意 2. 分析 二分法有一个关键特征:如果答案answer满足题意,那么对于任何整数i,如果有i>answer,那么i也会是一个存在的解,只不过不是最优解。 本题想要找出一个达到 totalTrips 趟需要的最少时间成本t&#x…

FreeRTOS 入门 知识

什么是FreeRTOS FreeRTOS 是一个轻量级的实时操作系统(RTOS),由 Richard Barry 在 2003 年开发,并且由亚马逊的 FreeRTOS 项目(一个由 Amazon Web Services (AWS) 支持的开源项目)进一步推动和发展。FreeR…

麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140387947 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

Java--接口的定义与实现

1.Java的接口是一种约束 2.定义一些方法,让不同的人实现 3.方法都是 public abstract 4.常量都是public static final 5.接口不能被实例化: 接口中没有构造方法 6.接口可以多继承: 使用implements即可实现 7.必须要重写接口中的方法…

在家上网IP地址是固定的吗?

在数字化时代,互联网已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都离不开网络的支持。然而,当我们在家中接入互联网时,可能会产生这样一个疑问:在家上网IP地址是固定的吗?下面一…