【Java】设计模式——策略模式

前言

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。通过这种方式,可以避免使用大量的 if-else 或 switch 语句来处理不同的行为,而是通过策略接口和不同的策略实现类来封装每一种行为。

策略模式的核心思想是将每个算法(或策略)封装成一个独立的类,并让这些类可以互换使用。这使得系统更加灵活、扩展性更强。

1.策略模式的组成

  • Context(上下文):使用某个策略类的对象。
  • Strategy(策略接口):定义所有支持的算法的公共接口。
  • ConcreteStrategy(具体策略类):实现了策略接口的具体算法。

2.策略模式的使用场景

  • 当一个系统需要在多种算法中动态选择一种时:例如,不同的支付方式(信用卡支付、支付宝支付、微信支付等)可以用策略模式进行实现,每种支付方式可以看作一个独立的策略。
  • 当需要消除条件语句以提高代码可读性和可维护性时:例如,一个复杂的税务计算系统,可以根据不同地区、不同类型的商品使用不同的税率策略。

3.策略模式实现案例

3.1 定义策略接口

定义一个支付策略接口 PaymentStrategy,其中包含一个支付方法 pay。

java 复制代码
// 策略接口
public interface PaymentStrategy {
    void pay(double amount);
}

3.2 实现具体策略类

实现具体的支付策略类,如信用卡支付、支付宝支付和微信支付。

java 复制代码
// 具体策略类 - 信用卡支付
public class CreditCardPayment implements PaymentStrategy {
 	// 定义一些类变量
    private String cardNumber;
    private String name;
    private String expiryDate;

    public CreditCardPayment(String cardNumber, String name, String expiryDate) {
        this.cardNumber = cardNumber;
        this.name = name;
        this.expiryDate = expiryDate;
    }

    @Override
    public void pay(double amount) {
        System.out.println(amount + "使用信用卡支付");
    }
}

// 具体策略类 - 支付宝支付
public class AlipayPayment implements PaymentStrategy {
	// 定义一些类变量
    private String email;

    public AlipayPayment(String email) {
        this.email = email;
    }

    @Override
    public void pay(double amount) {
        System.out.println(amount + "使用支付宝支付");
    }
}

// 具体策略类 - 微信支付
public class WeChatPayment implements PaymentStrategy {
	// 定义一些类变量
    private String phoneNumber;

    public WeChatPayment(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    @Override
    public void pay(double amount) {
        System.out.println(amount + "使用微信支付");
    }
}

3.3 定义上下文类

定义一个上下文类 PaymentContext,用于设置和使用支付策略。

java 复制代码
// 上下文类
public class PaymentContext {
    private PaymentStrategy paymentStrategy;

    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

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

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

3.4 使用策略示例

在客户端代码中,创建不同的支付策略实例,并在上下文中使用它们。

java 复制代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        double amount = 100.0;

        // 使用信用卡支付
        PaymentStrategy creditCardPayment = new CreditCardPayment("1234-5678-9012-3456", "John", "2024/11/11");
        PaymentContext context = new PaymentContext(creditCardPayment);
        context.executePayment(amount);

        // 使用支付宝支付
        PaymentStrategy alipayPayment = new AlipayPayment("test001@163.com");
        context.setPaymentStrategy(alipayPayment);
        context.executePayment(amount);

        // 使用微信支付
        PaymentStrategy weChatPayment = new WeChatPayment("13412345678");
        context.setPaymentStrategy(weChatPayment);
        context.executePayment(amount);
    }
}

输出结果:

java 复制代码
100.0 使用信用卡支付
100.0 使用支付宝支付
100.0 使用微信支付

4. 策略模式的优缺点

优点

  • 封装变化:策略模式可以将不同的行为封装成独立的策略类,避免代码中直接使用条件判断语句(如 if、switch)来切换不同的行为。
  • 代码复用:具体的策略类可以在不同的上下文环境中共享和复用。
  • 易于扩展:添加新的策略时,只需新增一个具体策略类即可,不需要修改现有代码,符合开闭原则。
  • 减少了客户端的复杂性:客户端只需要知道如何设置策略,而不需要关心具体策略的实现。

缺点

  • 增加了类的数量:每一个策略都会对应一个新的类,如果策略很多时,类的数量会大幅增加。
  • 客户端需要知道所有的策略:客户端需要了解所有可用的策略并在运行时选择合适的策略。
相关推荐
东风破_5 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
微尘寒风5 小时前
【Git】的安装和使用
java·git
东风破_6 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
y = xⁿ6 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
东风破_6 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
侧耳倾听1116 小时前
jwt使用简介
java·jwt
顶点多余7 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手7 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神7 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066498 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库