策略模式

介绍

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

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. 如果算法过多则会产生非常多的策略类, 占用系统内存.

相关推荐
功德+n13 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
明日清晨13 小时前
python扫码登录dy
开发语言·python
我是唐青枫13 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
JJay.13 小时前
Kotlin 高阶函数学习指南
android·开发语言·kotlin
bazhange13 小时前
python如何像matlab一样使用向量化替代for循环
开发语言·python·matlab
jinanwuhuaguo13 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
froginwe1113 小时前
CSS 创建:从基础到高级
开发语言
wuxinyan12314 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书14 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队14 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能