策略模式

介绍

**定义:**通过定义一系列算法并封装每个算法的方式使其可以独立于客户端变化, 并使它们之间可以进行自由的相互替换.

UML

示例

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

import com.sumlv.demo.entity.Order;
import com.sumlv.demo.enumeration.PaymentType;
import com.sumlv.demo.factory.PaymentStrategyFactory;
import com.sumlv.demo.strategy.PaymentStrategy;

import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) {
        Order order = new Order(
                1L,
                2L,
                3L,
                new BigDecimal("100.00"),
                PaymentType.ALIPAY
        );

        PaymentStrategy paymentStrategy = PaymentStrategyFactory.getPaymentStrategy(order.getPaymentType());
        paymentStrategy.handle(order);
    }

}
java 复制代码
package com.sumlv.demo.factory;

import com.sumlv.demo.enumeration.PaymentType;
import com.sumlv.demo.strategy.AliPayPaymentStrategy;
import com.sumlv.demo.strategy.PaymentStrategy;
import com.sumlv.demo.strategy.WeChartPaymentStrategy;

import java.util.HashMap;
import java.util.Map;

/**
 * 支付策略工厂
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-21
 */
public class PaymentStrategyFactory {

    private static final Map<PaymentType, PaymentStrategy> STRATEGY_MAP = new HashMap<>();

    static {
        STRATEGY_MAP.put(PaymentType.WE_CHART, new WeChartPaymentStrategy());
        STRATEGY_MAP.put(PaymentType.ALIPAY, new AliPayPaymentStrategy());
    }

    public static PaymentStrategy getPaymentStrategy(PaymentType paymentType) {
        return STRATEGY_MAP.get(paymentType);
    }

}
java 复制代码
package com.sumlv.demo.strategy;

import com.sumlv.demo.entity.Order;

/**
 * 支付策略(抽象策略类)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-21
 */
public interface PaymentStrategy {

    void handle(Order order);

}
java 复制代码
package com.sumlv.demo.strategy;

import com.sumlv.demo.entity.Order;

/**
 * 微信支付策略(具体策略类)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-21
 */
public class WeChartPaymentStrategy implements PaymentStrategy {

    @Override
    public void handle(Order order) {
        // 此处省略微信支付具体逻辑
        System.out.println("使用微信支付:" + order);
    }

}
java 复制代码
package com.sumlv.demo.strategy;

import com.sumlv.demo.entity.Order;

/**
 * 支付宝支付策略(具体策略类)
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-21
 */
public class AliPayPaymentStrategy implements PaymentStrategy {


    @Override
    public void handle(Order order) {
        // 此处省略支付宝支付具体逻辑
        System.out.println("使用支付宝支付:" + order);
    }

}
java 复制代码
package com.sumlv.demo.entity;

import com.sumlv.demo.enumeration.PaymentType;

import java.math.BigDecimal;

/**
 * 订单
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-21
 */
public class Order {

    private Long id;

    private Long userId;

    private Long productId;

    private BigDecimal price;

    private PaymentType paymentType;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getProductId() {
        return productId;
    }

    public void setProductId(Long productId) {
        this.productId = productId;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public PaymentType getPaymentType() {
        return paymentType;
    }

    public void setPaymentType(PaymentType paymentType) {
        this.paymentType = paymentType;
    }

    public Order(Long id, Long userId, Long productId, BigDecimal price, PaymentType paymentType) {
        this.id = id;
        this.userId = userId;
        this.productId = productId;
        this.price = price;
        this.paymentType = paymentType;
    }

    @Override
    public String toString() {
        return "Order{" +
                "id='" + id + '\'' +
                ", userId='" + userId + '\'' +
                ", productId='" + productId + '\'' +
                ", price=" + price +
                ", paymentType=" + paymentType +
                '}';
    }

}
java 复制代码
package com.sumlv.demo.enumeration;

/**
 * 支付类型
 *
 * @Auther: yuzhuo.song
 * @Date: 2026-03-21
 */
public enum PaymentType {

    WE_CHART,

    ALIPAY;

}

总结

使用场景

  1. 当系统中存在多重if else逻辑时, 可以使用策略模式替换;

  2. 当某一功能可以有多种不同实现时, 可以使用策略模式封装其每一种实现;

  3. 当我们希望隐藏某些业务的实现逻辑时, 可以使用策略模式对该算法进行封装.

优点:

1.多个策略之间可以自由切换且易于拓展;

  1. 可以替代代码中的多重if else, 体现面向对象的编程思想.

缺点:

  1. 客户端必须知道所有的策略类并自行决定使用哪个类;

  2. 如果算法过多则会产生非常多的策略类, 占用系统内存.

相关推荐
KobeSacre1 分钟前
CyclicBarrier 源码
java·jvm·算法
我登哥MVP19 分钟前
Hadoop成长史-从Nutch子项目到大数据生态王者
java·大数据·hadoop·分布式·云原生·云计算
进击切图仔22 分钟前
SAM3 微调标注流水线和 Label Studio
java·服务器·前端
名字还没想好☜24 分钟前
Go error 处理:errors.Is/As 与错误包装
开发语言·后端·golang·go·错误处理
红糖奶茶24 分钟前
Python 中 while 循环计数异常的常见原因分析与正确搓搓
开发语言·python
java1234_小锋29 分钟前
Maven 4 要来了:15 年后,Java 构建工具迎来“彻底重构“
java·重构·maven
Lucky_Turtle30 分钟前
【论文写作】PDF图片不清晰,打印生成PDF空白大,PDF字体嵌入
开发语言·pdf·c#
csdndenglu37 分钟前
Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据,无复杂要求时可替代VTK
开发语言·c++·图形渲染·3d渲染
霸道流氓气质38 分钟前
Java 工程师 AI 智能体学习路线 · 阶段 1:AI / LLM 基础认知 详解
java·人工智能·学习
JerrySir1 小时前
`spring.threads.virtual.enabled=true`:用三类负载定位等待、争用与拒绝
java·spring boot