简述设计模式-策略模式

概述

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

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

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 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);

    }
}

执行结果

相关推荐
碎梦归途2 小时前
23种设计模式-行为型模式之模板方法模式(Java版本)
java·开发语言·jvm·设计模式·软考·模板方法模式·软件设计师
YoseZang9 小时前
【设计模式】GoF设计模式之策略模式(Strategy Pattern)
设计模式·策略模式
世纪摆渡人9 小时前
设计模式-策略模式(Strategy Pattern)
设计模式·策略模式
yangyang_z10 小时前
【C++设计模式之Observer观察者模式】
c++·观察者模式·设计模式
不爱吃萝卜的嘤嘤怪12 小时前
如何删除vscod远程连接的服务器
运维·服务器·策略模式
Hxyle1 天前
c++设计模式
开发语言·c++·设计模式
摘星编程1 天前
并发设计模式实战系列(17):信号量(Semaphore)
设计模式·并发编程
琢磨先生David1 天前
Java 企业级开发设计模式全解析
java·设计模式
不当菜虚困1 天前
JAVA设计模式——(十一)建造者模式(Builder Pattern)
java·设计模式·建造者模式
codefly-xtl1 天前
责任链设计模式
java·开发语言·设计模式