简述设计模式-策略模式

概述

在策略模式中一个类的行为或者算法可以在运行时更改,这种类型的设计模式属于行为型模式。

在策略模式中定义了一系列的算法和策略,并将每个算法封装在独立的类中,使得他们能够互相替换,通过使用策略模式可以在运行时选择不同的算法,而不需要修改客户端代码。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象,策略对象改变 context 对象的执行算法。

举个通俗的例子

现在给我两个数字,我们想计算这两个数字的加减乘除的结果,每一种运算都是一种策略,可以将所有都实现出来,然后进行选择使用哪种。

应用场景

  1. 出门旅行的交通工具选择。比如有火车-飞机,有火车-汽车-飞机。都是不同的策略。

  2. 比如折扣。满500减50,和满500打8折,都是策略可供选择。

优缺点

优点:

算法可以自由切换,避免了多重复杂的条件语句。

缺点:

每增加一个策略都需要再实现一个策略类。并且策略都是对外公开的。

模式结构

  1. 策略接口(抽象策略):定义了实现策略对象的接口,规定了策略必须实现的方法,比如计算两个数必须实现计算方法。

  2. 具体实现(具体策略):实现了抽象接口,并且具体实现了接口的方法,不同策略实现的方法体不同,比如加减乘除。

  3. 环境(Context):维护对策略的引用,负责给调用方委派所需的实现策略。可以通过依赖注入(踩坑:@Service 版本)、简单工厂的方法获取具体策略。

示例代码

策略接口和具体实现

java 复制代码
public interface Strategy {

    /**
     * 计算策略
     *
     * @param num1
     * @param num2
     * @return
     */
    int calculate(int num1 , int num2);
}

//加法策略
public class CalculateAdd implements Strategy{
    @Override
    public int calculate(int num1, int num2) {
        System.out.println("执行加法策略");
        return num1 + num2;
    }
}
//减法策略
public class CalculateSubtract implements Strategy{
    @Override
    public int calculate(int num1, int num2) {
        System.out.println("执行减法运算");
        return num1 - num2;
    }
}
//乘法策略
public class CalculateMultiply implements Strategy{
    @Override
    public int calculate(int num1, int num2) {
        System.out.println("执行乘法策略");
        return num1 * num2;
    }
}

Context

java 复制代码
public class Context {
    private Strategy strategy;

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

    public void setStrategy(int num1, int num2) {
        System.out.println(strategy.calculate(num1, num2));
    }

}

Main

java 复制代码
public class test {
    public static void main(String[] args) {
        Context context = new Context(new CalculateAdd());
        context.setStrategy(4, 2);

        Context context1 = new Context(new CalculateMultiply());
        context1.setStrategy(4, 2);

        Context context2 = new Context(new CalculateSubtract());
        context2.setStrategy(4, 2);

    }
}

执行结果

相关推荐
BD_Marathon13 小时前
设计模式——合成复用原则
设计模式·合成复用原则
书院门前细致的苹果1 天前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
BD_Marathon1 天前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon1 天前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
jmxwzy1 天前
设计模式总结
设计模式
J_liaty2 天前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇2 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日2 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.2 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon2 天前
七大设计原则介绍
设计模式