策略模式的小记

简介: 本文介绍了策略模式的概念、结构和使用场景,并通过支付系统的例子展示了如何使用策略模式来动态选择不同的支付策略,包括定义支付策略接口、实现具体的支付策略类、创建上下文类以及在客户端动态选择支付策略。

策略模式

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

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

结构:

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

支付系统【场景再现】

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

在这里插入图片描述

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

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

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

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

相关文章
|
5月前
|
算法 数据安全/隐私保护
行为型 策略模式
行为型 策略模式
29 1
|
设计模式 算法 Java
什么场景要使用策略模式,什么场景不能使用?
如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。
155 0
|
前端开发
策略模式
策略模式
76 0
|
设计模式 算法
策略模式详细介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到具有共同接口的独立类中,使得它们可以互相替换。策略模式可以让算法的变化独立于使用它的客户端。
113 0
|
算法 测试技术 C#
C#策略模式
C#策略模式
64 0
|
设计模式 前端开发
关于策略模式我所知道的
关于策略模式我所知道的
85 0
|
算法 程序员 开发工具
简单说说我对策略模式的了解
简单说说我对策略模式的了解
84 0
|
设计模式 算法
我学会了,策略模式
策略模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
112 0
我学会了,策略模式