策略模式的小记

news2024/12/26 22:09:06

策略模式

    • 策略模式
    • 支付系统【场景再现】
    • 硬编码完成不同的支付策略
    • 使用策略模式,对比不同
      • (1)支付策略接口
      • (2)具体的支付策略类
      • (3)上下文
      • (4)客户端
      • (5)小结

策略模式

定义:策略模式是一种行为设计模式,在运行时改变对象的行为。

目的:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。

结构:

  • 策略接口:声明了所有支持的所有算法的公共接口。
  • 具体策略:实现了策略接口中声明的算法
  • 上下文:使用某个具体策略实例时,通常上下文会提供一个接口供客户端调用,内部则根据设定的策略来执行相应的算法。

支付系统【场景再现】

场景:支付系统 ,支付系统拥有多种不同的支付策略(信用卡,支付宝支付,微信支付)

在这里插入图片描述

硬编码完成不同的支付策略

依据传入支付策略不同,进行大量的if...else判断,倘若后续加入其他的第三方支付策略,则需要接着if...else代码冗余,耦合度搞,难以扩展(添加新的支付方式,必须修改processPayment方法)

public class Payment {
    public void processPayment(double amount, String paymentMethod) {
        if ("creditCard".equals(paymentMethod)) {
            System.out.println("Paying " + amount + " using credit card.");
        } else if ("alipay".equals(paymentMethod)) {
            System.out.println("Paying " + amount + " using Alipay.");
        } else if ("wechat".equals(paymentMethod)) {
            System.out.println("Paying " + amount + " using WeChat.");
        } else {
            throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod);
        }
    }
}

测试类:

public class Client {
    public static void main(String[] args) {
        Payment payment = new Payment();
        payment.processPayment(100.0, "creditCard");
        payment.processPayment(200.0, "alipay");
        payment.processPayment(300.0, "wechat");
    }
}

使用策略模式,对比不同

  • 定义一个支付策略接口
  • 实现具体的支付策略类
  • 创建一个上下文类来使用具体的支付策略

(1)支付策略接口

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

(2)具体的支付策略类

  1. 信用卡支付策略
public class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " using credit card.");
    }
}
  1. 支付宝策略
public class AlipayPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " using Alipay.");
    }
}
  1. 微信支付策略
public class WeChatPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " using WeChat.");
    }
}

(3)上下文

public class PaymentContext {
    
    private PaymentStrategy paymentStrategy;

    // 构造器注入策略
    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void processPayment(double amount) {
        paymentStrategy.pay(amount);
    }
}

(4)客户端

public class Client {
    public static void main(String[] args) {
        // 创建不同的支付策略
        PaymentStrategy creditCardPayment = new CreditCardPayment();
        PaymentStrategy alipayPayment = new AlipayPayment();
        PaymentStrategy weChatPayment = new WeChatPayment();

        // 使用不同的支付策略
        PaymentContext context = new PaymentContext(creditCardPayment);
        context.processPayment(100.0);

        context = new PaymentContext(alipayPayment);
        context.processPayment(200.0);

        context = new PaymentContext(weChatPayment);
        context.processPayment(300.0);
    }
}

(5)小结

策略模式:

  • 定义一个支付策略接口PaymentStrategy
  • 实现三个具体的支付策略类CreditCardPayment,AlipayPaymentWeChatPayment
  • 上下文类PaymentContext,来使用具体的支付策略
  • 客户端测试代码中动态选择不同的支付层策略

策略模式主要关注的是算法或行为的选择和封装。它允许在运行时动态地选择不同的算法或行为。

策略模式适用于需要在运行时选择不同的算法或行为的情况。例如,不同的排序算法、支付方式等。

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

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

相关文章

【Redis】Redis Sentinel(哨兵)系统:自动故障恢复与高可用性配置全解

目录 哨兵 (Sentinel)基本概念主从复制的问题⼈⼯恢复主节点故障哨兵⾃动恢复主节点故障 安装部署 (基于 docker)准备⼯作 以下部分是独立于这一章节的Docker安装Server版本安装CentOS安装实战经验 GUI版本安装(以windows 11为例)安装docker 以上部分是独…

elementUI table 给表头添加气泡显示(鼠标悬浮显示注释)

elementUI table 给表头添加气泡显示(鼠标悬浮显示注释) 前言:文档显示:(使用插槽,我看看到底是怎么个事儿)文档代码:修改后的效果:页面效果: 前言: 公司出现…

Termius for Mac/Win:高效、安全的跨平台多协议远程管理软件

Termius for Mac/Win是一款专为专业人士设计的跨平台多协议远程管理软件,以其强大的功能、简洁的界面和高效的操作体验,赢得了广泛的好评。这款软件不仅支持SSH、Telnet、SFTP等多种远程连接协议,还具备丰富的安全特性和便捷的管理功能&#…

免费的月考成绩发布小程序

月考成绩出炉,老师们便开始了一项既繁琐又耗时的工作:将成绩单私信给每位学生家长。需要老师们在繁忙的教学工作中抽出自己额外休息的时间,还要确保每位家长都能及时准确的收到自己孩子的成绩单。然而,随着科技的发展,…

歌者PPT新功能速递!

本期功能更新,主要围绕 PPT 大纲编辑器和 PPT 翻译功能,全面提升了制作效率和灵活性,帮助你更轻松地完成 PPT 制作!一起来看看吧~👇 # 功能更新 1 PPT 大纲编辑器全面更新 📝 现在&#xff0c…

StarRocks Lakehouse 快速入门——Apache Iceberg

导读: StarRocks Lakehouse 快速入门旨在帮助大家快速了解湖仓相关技术,内容涵盖关键特性介绍、独特的优势、使用场景和如何与 StarRocks 快速构建一套解决方案。最后大家也可以通过用户真实的使用场景来了解 StarRocks Lakehouse 的最佳实践&#xff01…

C++入门(03)新手常见问题集锦(一)

文章目录 1. 一闪而过使用system("pause")使用cin.get() 1. 一闪而过 .exe 在用户计算机上运行后“一闪而过”,因为控制台程序没有专门的用户图形界面,当程序执行完所有代码后就会自动关闭窗口。 使用system(“pause”) 在程序的结尾处加入…

Iceberg与SparkSQL整合DDL操作

前言 使用SparkSql操作Iceberg表之前我们得先配置好catalog,配置方式参考这篇博客。 创建非分区表 Spark3使用USING iceberg来创建表: CREATE TABLE prod.db.sample (id bigint NOT NULL COMMENT unique id,data string) USING iceberg;这里的数据类…

伦敦银ATR策略

ATR这个技术指标由J.Welles Wilder发明,‌主要用来衡量伦敦银的价格波动,它虽然‌不能直接反映银价走向及其趋势稳定性,但‌ATR指标价值越高,‌趋势改变的可能性就越高;‌价值越低,‌趋势的移动性就越弱。 …

麒麟安全加固工具,为系统打造坚固“金钟罩”!

当今数字化时代,系统安全的重要性不言而喻。为应对网络安全风险、满足用户高等级安全诉求,麒麟软件打造了满足用户高等级安全诉求的 “麒麟安全加固工具”,实现服务器操作系统安全配置的规范化、标准化、制度化,为系统安全打造坚固…

node.js、php、Java、python校园点餐与数据分析系统 校园食堂订餐系统(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

uni-app--》打造个性化壁纸预览应用平台(三)

🏙️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名前端工程师 🌄个人主页:亦世凡华、 🌆系列专栏:uni-app 🌇座右铭:人生亦可燃烧,亦可腐败&#xf…

微服务注册中心都有哪些

在微服务架构中,注册中心扮演着至关重要的角色,用于服务的注册与发现。以下是一些常见的注册中心: Eureka: Eureka是Netflix开发的服务发现框架,后来贡献给了Spring Cloud。它主要用于AWS云,但也可以在其他…

【MySQL超详细安装步骤】Centos7安装MySQL8

文章目录 1.卸载2.修改yum源为阿里源2.1首先检查是否安装wget2.2 备份 yum 源文件2.3 下载阿里云yum源文件2.4 清理yum缓存 3.安装mysql源3.1 下载mysql源3.2 安装mysql源3.3 检查是否安装成功 4. 安装MySQL4.1 使用yum安装4.2 启动MySQL 5.配置防火墙5.1 开放3306端口 6.登录M…

服务器数据恢复—Raid磁盘阵列故障类型和常见故障原因

出于尽可能避免数据灾难的设计初衷,RAID解决了3个问题:容量问题、IO性能问题、存储安全(冗余)问题。从数据恢复的角度讨论RAID的存储安全问题。 常见的起到存储安全作用的RAID方案有RAID1、RAID5及其变形。基本设计思路是相似的:当部分数据异…

go切片的深入学习以及context库的使用

Go切片专项学习 go切片扩容机制 go1.18 之前: 1.如果期望容量大于当前容量的两倍就会使用期望容量; 2.如果当前切片的长度小于 1024 就会将容量翻倍; 3.如果当前切片的长度大于 1024 就会每次增加 25% 的容量,直到新容量大于期…

JavaScript - 对象编程之详解DOM对象

1. 文档对象模型(DOM) HTML DOM全称为HTML Document Object Model,专门适用于HTML/XHTML文档的对象模型。可以将HTML DOM理解为网页的API,将网页中的各种元素都看作一个对象,从而使网页中的元素也可以被计算机语言获取…

git的简单学习

(这个模块本来是会用的,但是了解并不是那么深入,因此需要继续学习一下) 1.下载安装 下载网址:https://git-scm.com/download/win/ 一直next就可以了。 2.检查 winr:cmd (不建议)…

零基础Opencv学习(四)

一、查找并绘制轮廓 /// 载入原始图,必须以二值图模式载入cv::Mat image cv::imread("E:/OpencvStudyTest/4.png", cv::ImreadModes::IMREAD_GRAYSCALE);cv::imshow("image", image);/// 初始化结果图cv::Mat dstImage cv::Mat::zeros(image.…

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果 右侧是世界坐标系中的相机与被观察物体 简介 上图右侧的图像是模拟的世界坐标系和世界坐标系中相机以及被观察物体; 左侧是在右侧世界坐标系中相机…