首页 > 其他分享 >策略模式(Strategy Pattern)

策略模式(Strategy Pattern)

时间:2023-05-17 22:22:42浏览次数:34  
标签:10 num1 num2 int Pattern 模式 Strategy public

策略模式

一、介绍

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

  • 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
  • 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
  • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
  • 如何解决:将这些算法封装成一个一个的类,任意地替换。
  • 关键代码:实现同一个接口。

二、优缺点

2.1 优点

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

2.2 缺点

  1. 策略类会增多。
  2. 所有策略类都需要对外暴露。

三、使用场景

  1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  2. 一个系统需要动态地在几种算法中选择一种。
  3. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

四、具体实现

1、创建一个接口

/**
 * 策略模式接口
 *
 * @author zt1994 2021/4/3 17:39
 */
public interface Strategy {

    /**
     * 操作
     *
     * @param num1
     * @param num2
     * @return
     */
    int doOperation(int num1, int num2);
}

2、创建实现接口的实体类

/**
 * 加法实现类
 *
 * @author zt1994 2021/4/3 17:42
 */
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

/**
 * 减法实现类
 *
 * @author zt1994 2021/4/3 17:43
 */
public class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

/**
 * 乘法实现类
 *
 * @author zt1994 2021/4/3 17:44
 */
public class OperationMultiply implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

3、创建 Context 类

/**
 * context
 *
 * @author zt1994 2021/4/3 17:44
 */
public class Context {

    private Strategy strategy;

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

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

4、使用 Context 来查看当它改变策略 Strategy 时的行为变化

/**
 * 策略模式测试类
 *
 * @author zt1994 2021/4/3 17:45
 */
public class StrategyPatternTest {

    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

5、测试结果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

标签:10,num1,num2,int,Pattern,模式,Strategy,public
From: https://www.cnblogs.com/zt19994/p/17410512.html

相关文章

  • Day01 web应用模式与api接口
    1Web应用模式#前后端混合开发 -后端人员,既要写后端,django,又要写前端#前后端分离 -后端人员,只写后端,写一个个的API接口-前端人员,只写前端-最后项目写完,前后端联调2API接口#为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得......
  • 观察者模式(代码简单介绍)
    观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖者都会被通知并自动更新。在这个模式中,改变状态的对象被称为“主题”,依赖者被称为“观察者”。当使用观察者模式时,同样有三个核心角色:主题(Subject)、观察者(Observer)和具体观......
  • CST为什么要关闭 GPU 卡的 ECC 模式而开启 TCC 模式?操作使用【详解】
    在使用CST软件之前,我们一般建议大家关闭GPU卡的ECC模式而开启TCC模式。那么,为什么要进行这样一个操作呢?在此之前,给大家科普一下什么是“ECC”和“TTC”。 “ECC” 其实是ErrorCorrectionCode的缩写,是NVIDIA(英伟达) 内自带的错误纠正代码,一般是用来检查和在某些情......
  • java设计模式【抽象工厂模式】
    java设计模式【抽象工厂模式】抽象工厂模式抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不......
  • java设计模式【工厂方法模式】
    java设计模式【工厂方法模式】工厂方法模式工厂方法模式(FACTORYMETHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具......
  • 《3D编程模式》写书-第6次记录
    大家好,这段时间我完成了对初稿的第二轮修改,已经把稿子提交给编辑了这里是所有的的写书记录:《3D编程模式》写书记录本轮修改主要进行了下面的修改:修改UML描述增加依赖关系角色之间的关系中增加x对x的明确描述修改分析角色“总体来看”加上用户这个部分,使其与UML......
  • ★常用设计模式
    创建型模式简单工厂选择不一样的参数,生成不一样的产品可用switch()来做参数选择publicclassFoodFactory{publicstaticFoodmakeFood(Stringname){if(name.equals("noodle")){Foodnoodle=newLanZhouNoodle();noodle.addSpicy("more");returnnoodle;}elseif......
  • 聊一聊适配器模式
    接口不能用?行,我帮你适配一、概述适配器模式(Adapter),是23种设计模式中的结构型模式之一;它就像我们电脑上接口不够时,需要用到的拓展坞,起到转接的作用。它可以将新的功能和原先的功能连接起来,使由于需求变动导致不能用的功能,重新利用起来。上图的Mac上,只有两个typec接口,当我们需......
  • Java设计模式-装饰模式
    简介装饰模式在Java领域是一种常见的设计模式,它能够在不改变对象原有结构的情况下,动态地为对象添加新的功能。它通过封装原有对象,在运行时动态地为对象添加新的行为或者修改原有行为,以扩展对象的功能。这种方式避免了继承的静态特性,让对象的行为可以根据需要进行动态变化。在装......
  • VUE- history模式发布项目部署
    VUE-history模式发布项目部署 环境:vue项目 发布后,通过nginx部署到docker容器内。如需要去掉路径中的#/ 则需要使用history模式发布。1. 修改路由的配置文件constrouter=newRouter({base:process.env.BASE_URL,scrollBehavior:()=>({y:0}),mode:'......