23种设计模式——策略模式 (Strategy Pattern)详解

发布于:2025-09-05 ⋅ 阅读:(17) ⋅ 点赞:(0)

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——策略模式 (Strategy Pattern)​详解
📚 ** ps **  :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 简介

三. 核心思想

四. 主要角色

五. 简单demo(Java)

六. 策略模式的优点

七. 策略模式的缺点

八. 总结


一. 背景

我原本也不知道策略模式是什么......知道有一天,发现手上需求的底层用的就是策略模式,于是才恍然大悟。于是结合网上的一些资料,完成了这篇博客。


二. 简介

策略模式​​ 是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。

大白话讲,就是定义了几个表示不同类型的类,让它们可以作为参数传入管理类的同一个方法中——至于为什么都满足管理类的方法参数条件,因为这些类型类都实现了一个相同的基类.......


三. 核心思想

  • 定义一组算法​​:把它们封装成独立的类(即策略类),这些类实现相同的接口或继承相同的抽象类。
  • 运行时动态选择算法​​:客户端在使用时根据需要选择具体的策略,而不需要修改使用算法的代码。
  • 遵循开闭原则(OCP)​​:对扩展开放,对修改关闭。新增策略时无需修改已有代码。

四. 主要角色

  1. Context(上下文)​
    持有一个策略对象的引用,负责与客户端交互,并调用策略对象的方法来执行具体行为。
  2. Strategy(策略接口)​
    定义所有支持的算法或行为的公共接口。
  3. ConcreteStrategy(具体策略类)​
    实现 Strategy 接口,提供具体的算法实现。

五. 简单demo(Java)

下面代码模拟了一个电商系统,针对不同用户类型(如普通用户、VIP用户)有实现不同的折扣策略。

// Strategy: 折扣策略接口
public interface DiscountStrategy {
    double applyDiscount(double originalPrice);
}
// ConcreteStrategy: 普通用户无折扣
public class NoDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double originalPrice) {
        return originalPrice;
    }
}

// ConcreteStrategy: VIP用户打8折
public class VipDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double originalPrice) {
        return originalPrice * 0.8;
    }
}
// Context: 负责使用策略
public class PricingContext {
    private DiscountStrategy discountStrategy;

    // 设置策略
    public void setDiscountStrategy(DiscountStrategy strategy) {
        this.discountStrategy = strategy;
    }

    // 执行折扣计算
    public double calculatePrice(double originalPrice) {
        if (discountStrategy == null) {
            throw new IllegalStateException("未设置折扣策略");
        }
        return discountStrategy.applyDiscount(originalPrice);
    }
}
public class Client {
    public static void main(String[] args) {
        PricingContext context = new PricingContext();

        double price = 100.0;

        // 普通用户,无折扣
        context.setDiscountStrategy(new NoDiscountStrategy());
        System.out.println("普通用户价格: " + context.calculatePrice(price)); // 输出 100.0

        // VIP用户,打8折
        context.setDiscountStrategy(new VipDiscountStrategy());
        System.out.println("VIP用户价格: " + context.calculatePrice(price)); // 输出 80.0
    }
}

通过上面的这些代码,通过简单的改变参数,就实现了对价格计算的快速替换,减少了if/else的判断逻辑,让代码更加简洁,并且容易扩展。


六. 策略模式的优点

  • ​开闭原则​​:新增策略不影响现有代码。
  • 消除条件语句​​:避免大量的 if-else 或 switch-case。
  • 提高可维护性与可扩展性​​:策略实现独立,易于理解和替换。
  • 算法复用​​:策略可以在不同的上下文中复用。

七. 策略模式的缺点

  • 客户端必须了解不同策略​​:客户端需要知道有哪些策略并选择合适的策略。
  • 类数量增多​​:每一种策略都是一个类,可能会增加类的数量。
  • 策略对象之间的通信较复杂时处理不便​​:如果策略之间有依赖关系,可能需要额外设计。

八. 总结

策略模式是一种行为型模式。通过定义一系列封装并可互换算法,以达到避免大量条件判断,实现算法的灵活切换和扩展的目的。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!


网站公告

今日签到

点亮在社区的每一天
去签到