首页 > 其他分享 >策略模式的小记

策略模式的小记

时间:2024-09-06 18:50:25浏览次数:7  
标签:PaymentStrategy 策略 processPayment 模式 amount 支付 public 小记

策略模式

策略模式

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

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

结构:

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

支付系统【场景再现】

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

在这里插入图片描述

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

依据传入支付策略不同,进行大量的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,来使用具体的支付策略
  • 客户端测试代码中动态选择不同的支付层策略

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

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

标签:PaymentStrategy,策略,processPayment,模式,amount,支付,public,小记
From: https://blog.csdn.net/m0_63622279/article/details/141965321

相关文章

  • BRAM IP Native模式使用
    简介    BRAM(‌BlockRAM)是‌FPGA(Field-ProgrammableGateArray)中的一种专用RAM资源,固定分布在FPGA内部的特定位置。该内容主要对BRAM(BlockRAM”的缩写)Native模式下IP界面做详细描述和使用。界面介绍Basic界面          1、选择对外接口,可以是AXI总线......
  • Linux救援模式
    故障背景:误删除或修改/etc/passwd导致无法远程登录.禁止root远程登录,没有添加普通用户,无法远程登录.root密码忘记,无法远程登录.linux无法启动1.解决方案root密码,恢复有备份的系统文件,都要重启系统,才能进入救援模式解决方案应用场景系统自带的救援模式......
  • 修复Microsoft Visual C++ 2015中msvcp140_ATOMIC_WAIT.dll缺失的5大策略
    在电脑使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140_ATOMIC_WAIT.dll丢失”。这个错误提示通常出现在运行某些程序或游戏时,给使用者带来了很大的困扰。那么,如何解决这个问题呢?一,原因分析msvcp140_ATOMIC_WAIT.dll是MicrosoftVisualC++2015运行时库的一部......
  • 代码大全避免命名冲突的策略
    在编程中,避免全局命名空间的命名冲突是一个重要的考虑,因为这有助于保持代码的清晰和可维护性。以下是一些在不同编程语言中划分全局命名空间和避免命名冲突的策略:C++和C#在C++和C#中,可以使用namespace关键字来组织代码,避免命名冲突。cpp//C++示例namespaceUser......
  • 5个惊人策略:打造完美的企业内部知识库
    引言:在这个快速变化的商业环境中,拥有一个结构化和高效的内部知识库不再是可选项,而是企业成功的必需品。SaaS(SoftwareasaService,软件即服务)平台的兴起,为企业打造这样的内部知识库提供了强有力的技术支持和灵活的部署方案。通过SaaS平台,企业可以实现知识的集成、共享和利......
  • VirtualBox中常见的网络设置模式
    1.NAT(网络地址转换)用途:默认的网络设置。适合虚拟机需要访问外部网络(如互联网),但不需要外界直接访问虚拟机的场景。特点:虚拟机通过主机系统的IP地址访问外网。主机和外网可以访问虚拟机发起的连接,但虚拟机不能被外部设备主动访问。类似于家庭路由器,虚拟机位于NAT后方。......
  • 深入解析CJS与MJS的差异:模块化编程中的两种主流模式比较
    在现代JaScript开发中,模块化编程已成为构建复杂应用的重要方式。常见的模块化标准有两种:CommonJS(CJS)和ESModule(MJS)。这两者在本质上虽然都是为了解决模块化问题,但在实现方式、使用场景等方面存在显著差异。本文将深入解析CJS与MJS的差异,帮助大家更好地理解它们的特点及在实际开发......
  • 设计模式之单例模式
      大家好!欢迎莅临厚土燎原的天地,深感荣幸能与您相遇在此,共同品读我的拙作。您的阅读如同春风化雨,对我而言意义非凡。衷心邀请您留下宝贵的评论与指点,每一字一句都是对我莫大的鼓励与鞭策。热烈欢迎,期待与您智慧碰撞,共绘思想的火花! ......
  • YOLOv9改进策略【注意力机制篇】| GAM全局注意力机制: 保留信息以增强通道与空间的相互
    一、本文介绍本文记录的是基于GAM注意力模块的YOLOv9目标检测改进方法研究。GAM注意力模块通过3D排列和重新设计的子模块,能够在通道和空间方面保留信息,避免了先前方法中由于信息减少和维度分离而导致的全局空间-通道交互丢失的问题。本文利用GAM改进YOLOv9,以增强模型的跨维......
  • 策略模式【Strategy Pattern】,什么是策略模式?核心思想?角色?优缺点?应用场景?略模式实现案
    目录设计模式专栏目录(点击进入…)策略模式【StrategyPattern】,什么是策略模式?核心思想?角色?优缺点?应用场景?略模式实现案例?目录什么是策略模式?策略模式核心思想策略模式的角色(1)策略接口(Strategy)(2)具体策略类(ConcreteStrategy)(3)上下文类(Context)策略模式的优缺点优点(1)......