当前位置: 首页 > article >正文

策略模式的小记

策略模式

    • 策略模式
    • 支付系统【场景再现】
    • 硬编码完成不同的支付策略
    • 使用策略模式,对比不同
      • (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.kler.cn/news/293795.html

相关文章:

  • GS-SLAM论文阅读笔记--LoopSplat
  • 智能新纪元:GPT-Next引领的AI革命及其跨领域应用
  • Identifying User Goals from UI Trajectories论文学习
  • SpringBoot整合Minio及阿里云OSS(配置文件无缝切换)
  • MySQL · 性能优化 · 提高查询效率的实用指南(下)
  • 用Python导入CSV和Excel表格数据到Word表格
  • 启动 Spring Boot 项目时指定特定的 application.yml 文件位置
  • 无人机种类详解!!!
  • DPDK基础入门(四):从源码角度解析同步互斥机制
  • 乐凡三防|国产化浪潮下的三防平板
  • 在VMware虚拟机中编译文件的时候报错:找不到头文件ft2build.h
  • 【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (pycharm)安装python库函数Matplotlib步骤
  • 备份还原 本地所有的Docker 镜像并且在另一台机器上还原
  • 【LeetCode 121】买卖股票的最佳时机
  • 【深入理解SpringCloud微服务】深入理解nacos配置中心(三)——服务端启动与获取配置源码分析
  • UNI-APP 溢出隐藏显示省略号
  • Hive SQL 分组与连接操作详解
  • html css网页制作成品
  • java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频)
  • 【STM32开发】GPIO最全解析及应用实例
  • Linux磁盘管理(精要)
  • 【数据结构-二维前缀和】力扣1277. 统计全为 1 的正方形子矩阵
  • SQL的高级查询练习知识点(day24)
  • centos8stream 修改为阿里云yum源
  • SQL进阶技巧:如何取时间序列最新完成状态的前一个状态并将完成状态的过程进行合并?
  • DataX用hdfsreader导入或导出hive数据
  • EmguCV学习笔记 C# 第10章 人脸识别
  • BMP280气压传感器详解(STM32)