【Java 设计模式】行为型之策略模式

文章目录

    • [1. 定义](#1. 定义)
    • [2. 应用场景](#2. 应用场景)
    • [3. 代码实现](#3. 代码实现)
    • 结语

策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现,而不是在编译时固定使用某个算法。在本文中,我们将深入研究Java中策略模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

策略模式是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现,而不是在编译时固定使用某个算法。策略模式通常包含三个主要角色:环境(Context)、抽象策略(Strategy)和具体策略(ConcreteStrategy)。

  • 环境(Context): 维护一个对抽象策略的引用,并在运行时可以切换不同的具体策略
  • 抽象策略(Strategy): 定义了一个算法族的接口,具体策略实现这个接口
  • 具体策略(ConcreteStrategy): 实现了抽象策略定义的接口,提供具体的算法实现

2. 应用场景

策略模式通常在以下场景中使用:

  • 多算法选择:

    当一个系统需要支持多种算法,并且需要在运行时动态选择其中一种算法时,可以使用策略模式

  • 算法具有相同接口:

    当多个算法实现具有相同的接口时,可以使用策略模式。这样可以在不修改客户端的情况下轻松切换算法

  • 避免使用条件语句:

    当需要避免使用大量的条件语句来选择不同算法时,可以使用策略模式,将每个算法封装成一个策略类

3. 代码实现

下面通过一个简单的例子来演示策略模式的实现。假设有一个支付系统,我们可以使用策略模式来实现不同支付方式的选择。

抽象策略 - 支付策略 PaymentStrategy

java 复制代码
package com.cheney.demo;

interface PaymentStrategy {
    void pay(int amount);
}

具体策略 - 支付宝支付 AlipayStrategy

java 复制代码
package com.cheney.demo;

class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("使用支付宝支付 " + amount);
    }
}

具体策略 - 微信支付 WeChatPayStrategy

java 复制代码
package com.cheney.demo;

class WeChatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("使用微信支付 " + amount);
    }
}

具体策略 - 银行卡支付 CardPaymentStrategy

java 复制代码
package com.cheney.demo;

class CardPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("使用银行卡支付 " + amount);
    }
}

环境 - 支付上下文 PaymentContext

java 复制代码
package com.cheney.demo;

class PaymentContext {
    private PaymentStrategy paymentStrategy;

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

    public void processPayment(int amount) {
        if (paymentStrategy != null) {
            paymentStrategy.pay(amount);
        } else {
            System.out.println("未设置支付策略");
        }
    }
}

客户端启动器 Main

java 复制代码
package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 使用策略模式实现支付系统
        PaymentContext paymentContext = new PaymentContext();

        PaymentStrategy alipayStrategy = new AlipayStrategy();
        paymentContext.setPaymentStrategy(alipayStrategy);
        paymentContext.processPayment(100);

        PaymentStrategy weChatPayStrategy = new WeChatPayStrategy();
        paymentContext.setPaymentStrategy(weChatPayStrategy);
        paymentContext.processPayment(50);

        PaymentStrategy cardPaymentStrategy = new CardPaymentStrategy();
        paymentContext.setPaymentStrategy(cardPaymentStrategy);
        paymentContext.processPayment(200);
    }
}

在上述例子中,PaymentStrategy 是抽象策略,定义了支付策略的接口。AlipayStrategyWeChatPayStrategyCardPaymentStrategy 是具体策略,实现了支付策略的具体算法。PaymentContext 是环境类,维护一个对抽象策略的引用,并在运行时可以切换不同的具体策略。

在客户端中,我们使用策略模式实现了支付系统。通过设置不同的支付策略,可以轻松地选择不同的支付方式。

结语

策略模式是一种用于定义一系列算法、并使它们可以互相替换的设计模式。通过使用策略模式,可以实现更加灵活和可维护的代码,减少了客户端和算法之间的耦合度。在实际开发中,策略模式常被用于实现算法的动态切换、减轻条件语句的使用等场景。通过合理使用策略模式,可以提高系统的可扩展性和可维护性。

相关推荐
无巧不成书02188 小时前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
zs宝来了9 小时前
Playwright 自动发布 CSDN 的完整实践
java
吴声子夜歌10 小时前
TypeScript——基础类型(三)
java·linux·typescript
DynamicsAgg12 小时前
企业数字化底座-k8s企业实践系列第二篇pod创建调度
java·容器·kubernetes
森林里的程序猿猿12 小时前
并发设计模式
java·开发语言·jvm
222you12 小时前
四个主要的函数式接口
java·开发语言
Javatutouhouduan12 小时前
Java全栈面试进阶宝典:内容全面,题目高频!
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
SEO-狼术12 小时前
RAD Studio 13.1 Florence adds
java
ywf121513 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端