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。
  • 提高可维护性与可扩展性​:策略实现独立,易于理解和替换。
  • 算法复用​:策略可以在不同的上下文中复用。

七. 策略模式的缺点

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

八. 总结

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


最后,

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

相关推荐
Meteors.2 小时前
23种设计模式——访问者模式 (Visitor Pattern)
设计模式·访问者模式
Vallelonga2 小时前
Rust 设计模式 Marker Trait + Blanket Implementation
开发语言·设计模式·rust
en-route3 小时前
设计模式的底层原理——解耦
设计模式
杯莫停丶3 小时前
设计模式之:工厂方法模式
设计模式·工厂方法模式
Deschen3 小时前
设计模式-抽象工厂模式
java·设计模式·抽象工厂模式
粘豆煮包4 小时前
系统设计 System Design -4-2-系统设计问题-设计类似 TinyURL 的 URL 缩短服务 (改进版)
设计模式·架构
top_designer5 小时前
告别“静态”VI手册:InDesign与AE打造可交互的动态品牌规范
设计模式·pdf·交互·vi·工作流·after effects·indesign
非凡的世界6 小时前
深入理解 PHP 框架里的设计模式
开发语言·设计模式·php
一叶飘零_sweeeet6 小时前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式
Mr_WangAndy7 小时前
C++设计模式_行为型模式_状态模式State
c++·设计模式·状态模式