23种设计模式-策略(Strategy)设计模式

发布于:2025-03-27 ⋅ 阅读:(25) ⋅ 点赞:(0)

🚩什么是策略设计模式?

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

使用场景

  • 当需要在运行时选择不同的算法变体时

  • 当一个类定义了多种行为,并且这些行为以多个条件语句的形式出现时

  • 当需要隔离算法的具体实现与使用算法的客户端时

  • 适用于 支付方式选择排序算法切换折扣计算 等场景

🚩策略设计模式的特点

  • 定义算法族:将相关的算法封装成独立的策略类

  • 运行时切换:可以在运行时动态改变对象使用的算法

  • 消除条件语句避免使用多重条件判断来选择算法

  • 开闭原则:新增策略无需修改已有代码

  • 单一职责:每个策略类只负责一个算法

🚩策略设计模式的结构

策略模式主要包含以下部分:

  • Context(环境类):持有一个策略类的引用,调用具体策略

  • Strategy(抽象策略):定义所有支持的算法的公共接口

  • ConcreteStrategy(具体策略):实现抽象策略定义的算法

图例:

在这里插入图片描述

🚩策略设计模式的优缺点

✅ 优点

  • 算法可自由切换:策略类之间可以自由替换

  • 避免多重条件判断:将算法实现与使用分离

  • 扩展性好:增加新策略无需修改原有代码

  • 符合开闭原则:对扩展开放,对修改关闭

  • 易于单元测试:每个策略可以单独测试

❌ 缺点

  • 策略类数量增多:每个策略都是一个类,可能增加系统复杂度

  • 客户端必须了解所有策略:需要知道不同策略的区别

  • 策略对象可能增加开销:如果策略是无状态的,可以考虑共享

🚩策略设计模式的Java实现

代码地址:GitHub

  • 创建一个公共策略接口,定义公共操作两数操作方法TwoNumberOperation
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Strategy
 * @Description 所有策略的公共操作
 * @date 2025/3/26 10:14
 **/
public interface Strategy {
    public void TwoNumberOperation(int a, int b);
}
  • 定义三个具体的策略类,AddStrategySubtractionStrategyMultiplyStrategy

    • AddStrategy两数之和
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName AddStrategy
     * @Description 两数加法策略
     * @date 2025/3/26 10:33
     **/
    public class AddStrategy implements Strategy{
    
        @Override
        public void TwoNumberOperation(int a, int b) {
            System.out.println(a + b);
        }
    }
    
    • SubtractionStrategy两数之差
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName SubtractionStrategy
     * @Description 两数减法策略
     * @date 2025/3/26 10:35
     **/
    public class SubtractionStrategy implements Strategy {
    
        @Override
        public void TwoNumberOperation(int a, int b) {
            System.out.println(a - b);
        }
    }
    
    • MultiplyStrategy 两数之积
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName MultiplyStrategy
     * @Description 两数乘法策略
     * @date 2025/3/26 10:36
     **/
    public class MultiplyStrategy implements Strategy {
    
        @Override
        public void TwoNumberOperation(int a, int b) {
            System.out.println(a * b);
        }
    }
    
  • OperationContext 策略类引用

/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName OperationContext
 * @Description 策略引用
 * @date 2025/3/26 10:37
 **/
public class OperationContext {

    private Strategy strategy;

    public OperationContext(Strategy strategy) {
        this.strategy = strategy;
    }

    public void Operation(int a, int b) {
        strategy.TwoNumberOperation(a, b);
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • Strategy 接口定义了所有策略的公共操作

  • AddStrategySubtractionStrategyMultiplyStrategy 是具体策略实现

  • OperationContext 是环境类,持有一个策略引用

  • 客户端可以动态切换不同的策略对象

🚩总结

  • 策略设计模式 定义算法族并封装每个算法,使它们可以互相替换

  • 核心是 将算法与使用算法的客户端解耦,避免使用条件语句

  • 适用于 需要动态切换算法有多种相似行为 的场景

✅ Java源码中的应用场景:

  1. Java集合框架中的Comparator

    • 不同的排序策略可以通过实现Comparator接口来实现
  2. Java线程池的拒绝策略:

    • AbortPolicyCallerRunsPolicy等不同的拒绝策略实现

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述