津津乐道设计模式 - 策略模式详解(以女友购物策略让你彻底明白)

news2025/1/16 14:01:58

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 策略模式详解

  • 什么是策略模式
  • 策略模式适用场景
  • 生活案例
  • 案例代码1
  • 案例代码2
  • 结语

什么是策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,将每个算法封装起来,并使它们可以相互替换,以便根据不同的情况选择不同的算法进行执行。

策略模式适用场景

  • 算法的选择性:当程序需要根据不同的情况选择不同的算法或策略时,策略模式可以很好地应用。它允许在运行时动态地切换算法,使得系统更具灵活性和可扩展性。

  • 多个类似行为的存在:如果一个类拥有多个类似的行为,但每个行为在实现上有所不同,那么可以使用策略模式来将这些行为封装在独立的策略类中,并使它们可以互相替换。这样可以避免使用大量的条件语句或分支逻辑,使代码更加清晰和可维护。

  • 避免暴露复杂的条件逻辑:当存在大量复杂的条件逻辑时,使用策略模式可以将这些逻辑封装在具体的策略类中,使得主体逻辑更加简洁,易于理解和维护。

  • 需要在运行时动态地选择算法或策略:策略模式允许在运行时根据需要动态地选择不同的算法或策略。这对于需要根据用户输入、环境变量或其他动态因素来选择合适的算法或策略的情况非常有用。

  • 希望避免使用继承的情况:策略模式可以代替继承来实现不同行为的变化。通过使用组合而不是继承,可以更灵活地组织和管理代码。

策略模式在许多领域都有应用,包括软件开发、游戏开发、金融领域、人工智能等。它可以帮助提高代码的可维护性、灵活性和可扩展性,同时降低代码的耦合度。

生活案例

在生活场景中,我们可以通过以下例子来说明策略模式:

每每到了618、双11,你的女朋友经常会在不同的电商平台上购物。她喜欢寻找最佳的优惠策略来节省花费,因此她会根据不同的购物情况采用不同的优惠策略;

现在她要开始败家了,她上了某宝,某宝活动综合提供了20%的整体折扣优惠,并适用于所有的商品。同时发现护肤专区满减优惠满1000减250,这个时候她的CPU飞速计算:

  • 这个包包比平时省20%
  • 买护肤品满1000就可以减250 ,变相省了25%

于是在她一通操作下,将自己想要的加入到了购物车,并毫不犹豫找到你买单结算 😂😂;

案例代码1

上面女朋友购物案例中,我们使用JAVA代码来给大家演示一下

//定义策略接口
public interface DiscountStrategy {
    double applyDiscount(double price);
}

创建打折优惠策略

/**
 * 打折优惠策略
 */
public class Discount implements DiscountStrategy{
    private double discountPercentage;

    public Discount(double discountPercentage) {
        this.discountPercentage = discountPercentage;
    }
    @Override
    public double applyDiscount(double price) {
        return price * (1 - discountPercentage);
    }
}

创建满减优惠策略

/**
 * 满减优惠策略
 */
public class FullReduction implements DiscountStrategy{

    //定义满减临界值
    private double threshold;
    //定义满减金额
    private double reductionAmount;

    public FullReduction(double threshold, double reductionAmount) {
        this.threshold = threshold;
        this.reductionAmount = reductionAmount;
    }

    @Override
    public double applyDiscount(double price) {
        if (price >= threshold) {
            return price - reductionAmount;
        } else {
            return price;
        }
    }
}

定义女友类

/**
 * 定义女友 购物策略结算
 */
public class Girlfriend {
    private DiscountStrategy discountStrategy;

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double checkout(double totalPrice) {
        System.out.println("女友CPU飞速运转");
        return discountStrategy.applyDiscount(totalPrice);
    }
}

最后测试类

public class StrategyPatternTest {
    public static void main(String[] args) {

        Girlfriend cart = new Girlfriend();
        // 使用打折优惠策略
        DiscountStrategy discountStrategy = new Discount(0.2);
        cart.setDiscountStrategy(discountStrategy);
        double totalPrice = 100.0;
        double finalPrice = cart.checkout(totalPrice);
        System.out.println("使用打折优惠后的价格:" + finalPrice);

        // 使用满减优惠策略
        DiscountStrategy fullReductionStrategy = new FullReduction(200.0, 50.0);
        cart.setDiscountStrategy(fullReductionStrategy);
        totalPrice = 250.0;
        finalPrice = cart.checkout(totalPrice);
        System.out.println("使用满减优惠后的价格:" + finalPrice);
    }
}

最后输出如下:
在这里插入图片描述
这个现实生活场景中的购物案例展示了策略模式的应用。通过选择不同的购物策略,你能够根据不同商城的促销优惠来获取最佳的价格。策略模式使得购物策略的变化独立于你的购物行为,为你提供了灵活性和选择性。

案例代码2

在一个电商平台上,用户可以选择不同的支付方式来完成订单支付,比如信用卡支付、支付宝支付、微信支付等。每种支付方式都有自己的特点和实现方式。

在这种情况下,策略模式可以被应用于支付场景中。让我们看看如何使用策略模式来实现支付功能:
首先,我们定义一个支付策略接口,例如 PaymentStrategy

public interface PaymentStrategy {
    void pay(double amount);
}

然后,我们创建不同的支付策略类来实现具体的支付方式,比如 信用卡支付 CreditCardPaymentStrategy支付宝支付 AlipayPaymentStrategy微信支付 WeChatPaymentStrategy 等。

//信用卡支付策略
public class CreditCardPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // 实现信用卡支付逻辑
        System.out.println("使用信用卡支付:" + amount + " 元");
    }
}

//支付宝支付策略
public class AlipayPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // 实现支付宝支付逻辑
        System.out.println("使用支付宝支付:" + amount + " 元");
    }
}

//微信支付策略
public class WeChatPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // 实现微信支付逻辑
        System.out.println("使用微信支付:" + amount + " 元");
    }
}

接下来,我们创建一个订单类 Order,它具有支付功能,通过设置不同的支付策略来完成支付。

public class Order {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void processPayment(double amount) {
        // 调用支付策略的支付方法
        paymentStrategy.pay(amount);
    }
}

最后,我们可以在客户端代码中使用策略模式来完成订单支付:

public class PaymentApp {
    public static void main(String[] args) {
        Order order = new Order();

        // 使用信用卡支付
        PaymentStrategy creditCardPayment = new CreditCardPaymentStrategy();
        order.setPaymentStrategy(creditCardPayment);
        order.processPayment(100.0);

        // 使用支付宝支付
        PaymentStrategy alipayPayment = new AlipayPaymentStrategy();
        order.setPaymentStrategy(alipayPayment);
        order.processPayment(200.0);

        // 使用微信支付
        PaymentStrategy weChatPayment = new WeChatPaymentStrategy();
        order.setPaymentStrategy(weChatPayment);
        order.processPayment(300.0);
    }
}

在上述代码中,我们创建了一个订单对象 order,然后根据用户选择的支付方式设置相应的支付策略,最后调用 processPayment 方法来完成支付。

通过策略模式,用户可以根据自己的需求选择不同的支付方式,而不需要修改订单类的代码。这样可以使系统更加灵活,易于扩展和维护。

这个支付场景的例子展示了策略模式在实际应用中的使用,它将支付方式的选择和具体的支付逻辑解耦,提供了一种灵活的设计方案。

结语

本章主要带大家认识什么是策略模式,策略模式适用场景有哪些,并通过两个现实生活的场景给大家演示策略模式的使用,策略模式也是我们平时开发经常会用的模式之一,希望大家能熟练掌握~ 如果本篇文章对你有用,欢迎关注收藏评论!

样例代码:https://github.com/lhmyy521125/toher-designmode

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

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

相关文章

Git工具【系统学习】

第一章 Git快速入门 1.1 Git概述 Git是一个免费的,开源的分布式版本控制系统,可以快速高效地处理从小型或大型的各种项目。Git易于学习,占用空间小,性能快得惊人。 1.2 SCM概述 SCM(Software Configuration Managem…

Deepin Community Live CD New Kernel——自带6.3.8内核的镜像和apt源

镜像介绍 此镜像属于 Deepin Community Live CD 系列(Deepin Community Live CD 简称为 DCLC,Deepin Community Live CD 是什么?传送门:https://bbs.deepin.org/post/242933),New Kernel 系列镜像旨在可以…

chatgpt赋能python:Python的下载流程

Python的下载流程 Python是一款流行的编程语言,其掌握程度在当今计算机科学领域越来越受到重视。在本文中,我们将探讨Python的下载流程,为初学者提供一些有用的信息。特别是,我们将着重介绍如何在Windows操作系统上下载Python。 …

Golang每日一练(leetDay0105) 超级丑数、右侧小于当前元素的个数

目录 313. 超级丑数 Super Ugly Number 🌟🌟 315. 计算右侧小于当前元素的个数 Count-of-smaller-numbers-after-self 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练…

chatgpt赋能python:Python下载安装教程

Python下载安装教程 Python是一种高级编程语言,具有简单易学、强大多样的特点,不仅可以用来开发网站、应用程序、游戏,还可以用于数据科学、机器学习、人工智能等领域,被广泛应用于各行各业。 本文将为您提供详细的Python下载安…

MongoDB简介

目录 1、NoSQL概述 2、什么是MongoDB 3、MongoDB特点 一、MongoDB安装(docker方式) 二、MongoDB安装(普通方式) 三、MongoDB 概念解析 1、NoSQL概述 NoSQL(NoSQL Not Only SQL),意即反SQL运动,指的是…

FcaNet: Frequency Channel Attention Networks论文总结

论文:https://arxiv.org/abs/2012.11879 中文版:FcaNet: Frequency Channel Attention Networks 源码:https://github.com/cfzd/FcaNet或https://gitee.com/yasuo_hao/FcaNet 一、论文背景和出发点 问题:许多工作都集中在如何设计…

【T+】安装畅捷通T+提示安装向导找不到环境检测工具,是否手动选择环境检测工具文件夹。

【问题描述】 在windows server 2008r2系统环境下, 安装畅捷通T专属云标准版18.0软件的时候,提示: 安装向导找不到环境检测工具,是否手动选择环境检测工具文件夹(CheckEnvironment) 点击【是】手动选择&…

leetcode数据库题第六弹

leetcode数据库题第六弹 626. 换座位1280. 学生们参加各科测试的次数1321. 餐馆营业额变化增长1327. 列出指定时间段内所有的下单产品1341. 电影评分1378. 使用唯一标识码替换员工ID1393. 股票的资本损益1407. 排名靠前的旅行者1484. 按日期分组销售产品1517. 查找拥有有效邮箱…

数字基带传输

常用码型: 为了适应信道的传输,传输码型必须具备以下基本特性: 1)无直流、很少的低频分量; 2)含有码元定时信息; 3)主瓣宽度窄; 4)适用于各种信源的…

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视

课程名称适应人群ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视 全面AI时代就在转角,道路已经铺好了“局外人”or“先行者”就在此刻等你决定 1、对ChatGPT感兴趣并希望有人手把手教学的新手 2、希望了解GPT各类应用抓住未来风口 3、希…

【软件设计师暴击考点】UML知识高频考点暴击系列

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

【Android Framework系列】第2章 Binder机制大全

1 Binder简介 1.1 什么是Binder Binder是Android中主要的跨进程通信方式。Android系统中,每个应用程序是由Android的Activity,Service,BroadCast,ContentProvider这四剑客中一个或多个组合而成,这四剑客所涉及的多进程…

【瑞萨RA_FSP】IWDT——独立看门狗定时器

文章目录 一、IWDT简介二、IWDT功能框图剖析1. IWDT 时钟源(1) 计数器时钟(2) 独立看门狗超时时间计算 2. IWDT 模块电路功能讲解3. 独立看门狗(IWDT)与看门狗(WDT)功能对比4. 怎么使用IWDT 三、IWDT实验1. 硬件设计2. 文件结构3.…

交通 | 考虑供需交互下的航空网络优化问题

编者按: 本文提出了一种包含供需交互作用的航空网络规划模型 (ANPSD),该模型同时考虑了航线选择、航班频率和机队组成等问题,还捕捉了航空公司的供应和乘客需求之间的相互依赖关系。作者将需求实证函数与 ANPSD 模型相结合,开发了…

代码随想录算法训练营第四十四天|完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

【数据结构】顺序表,链表

前言 小亭子正在努力的学习编程,接下来将开启 javaEE 的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 目录 前言 顺序表 ArrayList ArrayLi…

K8S存储值之PV和PVC

1. 概念: 1.1. PersistentVolume (PV): 是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV也是集群中的资源。PV是Volume之类的卷插件,但具有独立于使用PV的Pod的生命周期。此API对象包含存储实…

数字图像处理-图像复原与重建

文章目录 一、图像退化/复原过程的模型二、噪声模型2.1噪声的空间和频率特性2.2一些重要的噪声概率密度函数2.2.1高斯噪声2.2.2瑞利噪声2.2.3爱尔兰(伽马)噪声2.2.4指数噪声2.2.5均匀噪声2.2.6脉冲(椒盐)噪声 2.3周期噪声 三、只存…

【ABAP】数据类型(四)「类型组TYPE-POOL」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较…