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

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


目录

[一. 背景](#一. 背景)

[二. 简介](#二. 简介)

[三. 核心思想](#三. 核心思想)

[四. 主要角色](#四. 主要角色)

[五. 简单demo(Java)](#五. 简单demo(Java))

[六. 策略模式的优点](#六. 策略模式的优点)

[七. 策略模式的缺点](#七. 策略模式的缺点)

[八. 总结](#八. 总结)


一. 背景

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


二. 简介

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

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


三. 核心思想

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

四. 主要角色

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

五. 简单demo(Java)

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

java 复制代码
// Strategy: 折扣策略接口
public interface DiscountStrategy {
    double applyDiscount(double originalPrice);
}
java 复制代码
// 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;
    }
}
java 复制代码
// 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);
    }
}
java 复制代码
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。
  • 提高可维护性与可扩展性​:策略实现独立,易于理解和替换。
  • 算法复用​:策略可以在不同的上下文中复用。

七. 策略模式的缺点

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

八. 总结

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


最后,

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

相关推荐
qq_435139576 小时前
【1】策略模式 + 模板方法模式的联合应用
策略模式·模板方法模式
念念不忘 必有回响16 小时前
js设计模式-装饰器模式
javascript·设计模式·装饰器模式
Meteors.16 小时前
23种设计模式——代理模式(Proxy Pattern)详解
设计模式·代理模式
晨星05271 天前
软件设计模式之单例模式
单例模式·设计模式
Meteors.1 天前
23种设计模式——装饰器模式(Decorator Pattern)详解
java·设计模式·装饰器模式
谢栋_1 天前
设计模式从入门到精通之(六)策略模式
设计模式·bash·策略模式
the sun341 天前
常见的设计模式(3)工厂模式
设计模式
小蜗牛在漫步1 天前
23种设计模式-模板方法模式
设计模式·模板方法模式
念念不忘 必有回响1 天前
js设计模式-状态模式
javascript·设计模式·状态模式