策略模式

介绍

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

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

相关推荐
freexyn3 小时前
Matlab入门自学七十四:坐标系转换,直角坐标、极坐标和球坐标的转换
开发语言·算法·matlab
贼爱学习的小黄3 小时前
NC BIP参照开发
java·前端·nc
小江的记录本3 小时前
【MyBatis-Plus】MyBatis-Plus的核心特性、条件构造器、分页插件、乐观锁插件
java·前端·spring boot·后端·sql·tomcat·mybatis
小张会进步3 小时前
数组:二维数组
java·javascript·算法
vx-程序开发3 小时前
springboot在线装修管理系统-计算机毕业设计源码56278
java·c语言·spring boot·python·spring·django·php
大傻^3 小时前
Spring AI Alibaba 可观测性实践:AI应用监控与链路追踪
java·人工智能·后端·spring·springaialibaba
Dxy12393102163 小时前
js如何把字符串转数字
开发语言·前端·javascript
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【1】阿里巴巴 AI 生态
java·人工智能·spring
诗人不写诗3 小时前
spring是如何组织切面的
java·后端·spring