策略模式【结合Spring框架实践】

这篇具有很好参考价值的文章主要介绍了策略模式【结合Spring框架实践】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hello!~大家好啊,很高兴我们又见面了,今天我们一起学习设计模式–【策略模式】

初次对此模式不懂的,或者想偷懒的,我强烈建议大家跟着我的一起把概念和代码一起敲一遍!~为啥子??因为我就是这样学会的,哈哈哈!

1.首先我们看下此模式的整体UML图

selector:选择器又叫做上下文context,【作用】通过不同的标识从而获取对应的策略实例(这是很关键的一个点,你细品~)

抽象策略: 如图所示,这是策略模式的顶层接口【就相当于领导~干运筹帷幄的】

策略实例 n:封装不同算法业务的实例对象,【就是特么真正干活的~!比如俺们码农】

策略模式【结合Spring框架实践】,策略模式,spring,java

2.案例实现

我们一个实际的案例进行实操,掌握这看起来高大上的策略模式,也是后面若你要面试,也能吹牛逼啊~

案例:

比如我们要统计餐厅的人流量数据做统计,统计的时间维度:一周和一个月,我们用策略模式咋实现呢? 我们往下看

实现需求分析:

策略模式【结合Spring框架实践】,策略模式,spring,java

  1. 前置设计:
    1. 我们定义常量标识策略的类型,
    2. 使用者调用时可通过常量获取对应的策略实例
  2. 策略设计
    1. 策略实例: 创建两个Bean实例: 周维度 &&月维度,并实现其中对应的算法和业务
    2. 抽象策略:通常我们定义一个通用的接口或者抽象方法,为啥???为了让外部能够访问啊!否则不是闭关锁国了嘛!~~
  3. 选择器设计: 这块就是挺重要的啦,我们通常采用MAP来存储数据,这样调用者就可以通过策略标识获取对应的策略实例

注意:

对于第三点可以是一道面试题:请问你怎么将策略的Bean注入到MAP中的?(不看答案,别心里好家伙,思考思考~哈哈)

也许你的第一反应:

我就直接将Bean对应的Class写死在``MAP中,然后通过applicationContext.getBaen()`获取其实例,这是最简单粗暴的!(也一看就是**菜鸡写法**哈哈哈)

若是这样回答,面试官肯定会问,这个通过写死的方法,那么下次我想增加其他维度的那不是要再次往Map中再添加,这麻烦先不说,也不符合开闭原则啊!~

你尴尬的扣了扣脚,微笑回答到:

是的,这是我一开始使用的,当时业务量不大,只考虑上面的两种情况,我就直接使用采取这种直接写死法,

但后面随着业务线的拓展,我也发现此中写法的弊端:

我的改进措施:(在Springboot的环境中)

1.通过解析注解来实现,给每个策略实例打上一个注解,我们业务是以周和月为维度进行常量标识的

2.过程: 在Springboot启动时,通过扩展点扫描抽象策略,获取它的策略实例

3.然后解析注解,放入MAP

这种就不用对原先代码就行逻辑代码改动,既符合开闭原则,又回到了面试官,爽哉!~

说了这么多,那关于代码我们怎么实现呢?–>耐心点,我们一起往下看

代码实现

1.抽象策略

package org.boyunv.strategy_pattern.handler;

/**
 * <p>
 * 描述:  抽象策略    <br>
 * <p>
 * 需求信息: 【需求ID与需求标题】【客户名称】 <br>
 *
 * @author aristo
 * @date 2024/1/23 19:07
 */
public interface TimeDimensionBaseHandlerInterface {
    //此方法是留给不同策略实体实现不同策略的方法实现
    void  statistic();
}

2.【策略实体】

这里我们注册组件直接采用Spring框架的组件@Component进行注册即可

1.周统计维度

package org.boyunv.strategy_pattern.handler;

import org.springframework.stereotype.Component;

/**
 * <p>
 * 描述:  策略实体: 周统计维度$      <br>
 * <p>
 * 需求信息: 【需求ID与需求标题】【客户名称】 <br>
 *
 * @author aristo
 * @date 2024/1/23 19:12
 */
@Component("week")
public class StatisticByWeekHandler implements TimeDimensionBaseHandlerInterface{
    @Override
    public void statistic() {
        //具体实现
        System.out.println("通过周统计维度实现统计数据");
    }
}

2.月统计维度

package org.boyunv.strategy_pattern.handler;

import org.springframework.stereotype.Component;

/**
 * <p>
 * 描述:  策略实体: 月统计维度$      <br>
 * <p>
 * 需求信息: 【需求ID与需求标题】【客户名称】 <br>
 *
 * @author aristo
 * @date 2024/1/23 19:12
 */
@Component("month")
public class StatisticByMonthHandler implements TimeDimensionBaseHandlerInterface{

    @Override
    public void statistic() {
        System.out.println("通过月统计维度实现统计数据");
    }
}

3.选择器【Inevitable!】

看如下的代码,我们会发现他同样是个组件,@Component

@Resource:将我们注册的weekmonth组件注册进入MAP

package org.boyunv.strategy_pattern.selector;

import org.boyunv.strategy_pattern.handler.TimeDimensionBaseHandlerInterface;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;

/**
 * 描述:  选择器,核心重点$      <br>
 * 需求信息: 【需求ID与需求标题】【客户名称】 <br>
 * @date 2024/1/23 19:26
 */
@Component
public class StatisticSelector {
    //这就和我们上面的所说的:定义Map,并通过@Resource注解完成我们刚才week和month的组件注入(很关键的一步哦!~)
    @Resource
    private Map<String, TimeDimensionBaseHandlerInterface> selectorMap;

    //下面根据类型选择策略
    public TimeDimensionBaseHandlerInterface select(String type){
        return selectorMap.get(type);
    }
}

4.我们进行测试

package org.boyunv.strategy_pattern.selector;

import org.boyunv.strategy_pattern.handler.TimeDimensionBaseHandlerInterface;
import org.junit.Test;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;

/**
 * 描述:  选择器,核心重点$      <br>
 * 需求信息: 【需求ID与需求标题】【客户名称】 <br>
 * @date 2024/1/23 19:26
 */
@Component
public class StatisticSelector {
    //这就和我们上面的所说的:定义Map,并通过@Resource注解完成我们刚才week和month的组件注入(很关键的一步哦!~)
    @Resource
    private Map<String, TimeDimensionBaseHandlerInterface> selectorMap;

    //下面根据类型选择策略
    public TimeDimensionBaseHandlerInterface select(String type){
        return selectorMap.get(type);
    }

    public  void doInvoke(String type){
        TimeDimensionBaseHandlerInterface handler=select(type);
        handler.doStatistic();
    }
    @Test
    public void invoke(){
        this.doInvoke("week");
        this.doInvoke("month");
    }
}

完结:

通过上面的运行步骤,我们最中实现策略模式的周和月的策略实现

这里面的核心点,再次提醒下:

通过Spring获取接口的实现,并解析实现类上的注解的方式,可以在程序启动时动态的将策略注入到一个Map中,作为策略的容器。

使用时传入标识符(就是常量)就可以获取到对应的策略执行了。文章来源地址https://www.toymoban.com/news/detail-820030.html

到了这里,关于策略模式【结合Spring框架实践】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一行代码搞定Spring策略模式,强的离谱

    在Spring中大量使用策略模式来简化 if/else 代码,比如Spring Security 的各种 AuthenticationProvider 等等,但是实现方式过于麻烦,使用重复套路来实现。 场景:关于用户订单充值(订单支付同理),我们都知道,现今的支付方式是非常的多的,例如:支付宝、微信、银联、钱包(各个

    2024年02月07日
    浏览(29)
  • 策略模式+Spring配置类优化多if..else思路

    场景: 假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理。如果我们通过if..else的方式处理的话会显得比较冗余。 例如: 那么对于不同消息的不同的处理逻辑我们可以单独放在一个实现类中,这些类有着相同的行为,所以我们可以定义一个接口: 针对于不

    2024年02月15日
    浏览(29)
  • 使用策略模式实现 Spring 分布式和单机限流

    我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。 思路是定义一个 RateLimitStrategy 接口,并分别实现单机限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy 。在 AOP 切面中,根据配置决定使用哪种限流策略。 定义策略

    2024年04月24日
    浏览(25)
  • 什么是 Spring 框架?使用 Spring 框架的好处是什么?Spring 框架中用到了哪些设计模式?列举一些重要的Spring模块?

    Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 Spring 官网 :https://spring.io/ Spring 框架指的是 Spring Framework ,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。         这些 模块 是:核心容器、数据访问/集成,、Web、

    2024年02月13日
    浏览(33)
  • IDEA项目实践——Spring框架简介,以及IOC注解

    IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 文章目录 第1章 Spring 概述

    2024年02月14日
    浏览(31)
  • Spring Boot 集成 Redis 三种模式实践汇总

    背景 项目的某个模块集成了 SpringBoot Redis 包,客户端使用 Lettuce,Redis 测试环境单机模式。但是现场反馈的 Redis 环境是集群,如果简单的修改 spring.redis 配置为集群的配置信息,程序能否能无缝衔接呢? 本文记录这个问题的验证过程: 集群配置和单机配置,直接改配置,R

    2024年02月15日
    浏览(37)
  • Spring框架中的8种设计模式

    前言 Spring框架中的8种设计模式分别是: 1、简单工厂。2、工厂方法。3、单例模式。4、适配器模 式。5、装饰器模式。6、代理模式。7、观察者模式。8、策略模式. 1、简单工厂 Spring中的 BeanFactory 就是简单工厂模式的体现, 根据传入一个唯一的标识来获得Bean对象 , 但是否在

    2024年02月05日
    浏览(32)
  • 设计模式_spring框架中常用的8种设计模式

    spring框架中常用到的8种设计模式清单如下: 设计模式 使用地方 备注 工厂模式 BeanFactory ApplicationContext 单例模式 Spring中的Bean 代理模式 Spring AOP java反射实现动态代理 模板方法模式 Spring中以Template结尾的类 使用继承的方式实现 观察者模式 Spring事件驱动模型 适配器模式 Spri

    2023年04月08日
    浏览(31)
  • 解锁Spring Boot中的设计模式—03.委派模式:探索【委派模式】的奥秘与应用实践!

    委派模式 是一种负责任务的调度和分配模式,类似于代理模式但更注重结果而非过程。它可以被视为一种特殊情况下的静态代理的全权代理,但并不属于GOF 23种设计模式之一,而是归类为行为型模式。 委派模式在Spring框架中广泛应用,其中最常见的例子是 DispatcherServlet ,它

    2024年02月19日
    浏览(38)
  • 解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!

    桥接模式也称为桥梁模式、接口模式或者柄体(Handle and Body)模式,是将 抽象部分 与他的 具体实现部分 分离 ,使它们都可以独立地变化,通过 组合 的方式 建立 两个类之间的 联系 ,而不是继承。 桥接模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们

    2024年02月21日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包