【设计模式】SpringBoot优雅使用策略模式

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

1.概述

本篇文章主要会描述SpringBoot与策略模式的结合使用,因为不涉及到理论部分,所以在阅读本篇之前,需要对策略模式的理论已经有了一个基本的了解。

1.1.简述策略模式

策略模式有3种角色,分别为:选择器抽象策略策略实例
其中选择器selector又被称为上下文context,其作用为通过不同的标识来获取对应的策略实例。策略实例就是封装不同算法的实例对象,而抽象策略就是策略实例的顶层接口。

简单类图大概就是这个样子:
【设计模式】SpringBoot优雅使用策略模式

2.实现方法

我们在学习设计模式的时候会发现在各类模式中的类与对象都是手动创建的,而在日常的开发中,我们往往会将对象的生命周期交给Spring管理,也就是说,需要我们自行将各类bean组合成一个可运行的设计模式。

假设我们有这样一个场景,需要对系统的中的数据做统计,需求中的统计维度分为:按周统计按月统计,现使用策略模式来实现这个需求。

2.1.实现思路

  • 前置设计:通过定义常量来标识策略的类型,使用者调用时可以通过常量获取对应的策略实例。
  • 策略设计:按周按月分别对应两个bean实例,在内部各自实现对应的统计维度逻辑,在两个bean实例的上层是抽象策略,有一个通用的接口(或抽象类)用于对外提供访问入口。
  • 选择器设计:可以通过Map来存储数据,调用者调用时可以通过策略标识来获取对应的策略实例。

可以看到,实现思路是比较简单的,现在的问题就是如何把策略的bean实例对象放到Map中。

最简单的方式当然就是把对应的beanClass对象直接写死在Map中,调用的时候可以通过applicationContext.getBean()获取到bean实例。但是这种方式不利于拓展,后续要新增一个策略实例的时候,还得修改这里的Map

第二种方式,我们可以通过解析注解来实现,给每个策略实例打上一个注解,注解中的值对应的就是按周按月这样的常量标识,在SpringBoot启动时,通过扩展点扫描抽象策略,获取它所有的策略实例,解析注解后放入Map中。这种方式利于拓展,新增一个策略实例不需要对旧代码有任何改动

2.2.实现代码

这里原本是使用自定义注解来实现的,经过评论区的提醒,对于注解实现这种方式,通过Spring中自带的@Component注解来实现会更加简洁,下面是去掉了自定义注解的实现方式。

  • 第一步:编写抽象策略与策略实例
    /**
     * 统计抽象策略处理器
     */
    public interface StatisticBaseHandler {
        void doStatistic();
    }
    
    import org.springframework.stereotype.Component;
    
    /**
     * 月统计策略
     */
    @Component("month")
    public class StatisticByMonthHandler implements StatisticBaseHandler {
    
        @Override
        public void doStatistic() {
            System.out.println("StatisticByMonthHandler");
        }
    }
    
    import org.springframework.stereotype.Component;
    
    /**
     * 周统计策略
     */
    @Component("week")
    public class StatisticByWeekHandler implements StatisticBaseHandler {
    
        @Override
        public void doStatistic() {
            System.out.println("StatisticByWeekHandler");
        }
    }
    
  • 第二步:编写选择器
    这里直接使用@Resouce或者@Autowired注入一个Map
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    import java.util.Map;
    
    /**
     * 统计策略选择器
     */
    @Component
    public class StatisticStrategySelector {
    
        @Resource
        private Map<String, StatisticBaseHandler> selectorMap;
    
        /**
         * 根据类型选择对应的策略
         *
         * @param type 统计周期类型
         * @return 统计抽象策略处理器
         */
        public StatisticBaseHandler select(String type) {
            return selectorMap.get(type);
        }
    }
    

启动完成之后,Map中的key值为@Component中配置的key
【设计模式】SpringBoot优雅使用策略模式

2.3.策略拓展

现在需求发生了变化,需要加入一个按年统计的策略类型,只需要新增一个策略实例即可,如下:

import org.springframework.stereotype.Component;

/**
 * 年统计策略
 */
@Component("year")
public class StatisticByYearHandler implements StatisticBaseHandler {

    @Override
    public void doStatistic() {
        System.out.println("StatisticByYearHandler");
    }
}

其他的代码都不需要修改,再次查看Map中的值:
【设计模式】SpringBoot优雅使用策略模式

2.4.执行调用

随便写了一个测试方法,如下:

public void invoke() {
    this.doInvoke("week");
    this.doInvoke("month");
    this.doInvoke("year");
}

public void doInvoke(String type) {
    StatisticBaseHandler handler = select(type);
    handler.doStatistic();
}

【设计模式】SpringBoot优雅使用策略模式
分别打印出了按周统计按月统计按年统计方法中的输出值,表示策略模式定义成功了,在我们实际的开放中,只需要前端(或其他调用端)传入对用的标识字符串,就可以执行不同的统计逻辑了。

3.总结

通过Spring获取接口的实现,并解析实现类上的注解的方式,可以在程序启动时动态的将策略注入到一个Map中,作为策略的容器。使用时传入标识符就可以获取到对应的策略执行了。文章来源地址https://www.toymoban.com/news/detail-495046.html

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

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

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

相关文章

  • Python设计模式:你的代码真的够优雅吗?

    当涉及到代码优化时,Python作为一种高级编程语言,具有广泛的应用领域和强大的功能。在软件开发中,设计模式是一种被广泛采用的解决问题的方案,它提供了一种在特定情境中重复使用的可行方案。在Python中,有许多设计模式可以用来优化代码。 其中两种常见的设计模式

    2024年01月25日
    浏览(45)
  • 设计模式——设计模式以及六大原则概述

    设计模式代表有经验的面向对象软件开发人员使用的最佳实践。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 这些解决方案是由许多软件开发人员在相当长的时间内通过试错获得的。 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四

    2024年02月13日
    浏览(51)
  • [设计模式]行为型模式-策略模式

    策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变换不会影响使用算法的客户。 在项目开发中,我们经常要根据不同的场景,采取不同的措施,也就是不同的策略。假设我们需要对a、b这两个整数进行计算,根据条件的不同,需要执行不

    2024年02月19日
    浏览(47)
  • 设计模式:策略模式

    策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。策略模式通过将算法封装成独立的策略类,使得它们可以互相替换,而不影响客户端的使用。 在策略模式中,有三个核心组件: 策略接口(Strategy Interface):定义了策

    2024年02月07日
    浏览(42)
  • 设计模式——策略模式

    定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把便用算法的责任和算法的实现分割开来,并委派给不算法进象行管理。 主要角色如下: 示例: 假定现在需要

    2024年02月22日
    浏览(38)
  • 设计模式之策略模式

    策略设计模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这种模式使算法的变化独立于使用算法的客户端。 概念 在策略模式中,有以下几个关键组成部分: 策略接口(

    2024年01月23日
    浏览(50)
  • 【设计模式】4、策略模式

    策略模式是一种行为设计模式,它能定义一系列算法,把每种算法分别放入独立的类中,以是算法的对象能相互替换。 一天, 你打算为游客们创建一款导游程序。 该程序的核心功能是提供美观的地图, 以帮助用户在任何城市中快速定位。 用户期待的程序新功能是自动路线

    2024年02月20日
    浏览(46)
  • 设计模式-策略模式

    策略模式是一种行为型设计模式,它允许在运行时动态改变对象的行为。在策略模式中,算法被封装在独立的策略类中,使得它们可以互换使用。下面是一个简单的例子: 假设我们有一个计算税收的系统,现在需要计算不同类型的商品的税收,例如书籍、食品和服装。每种商

    2024年02月15日
    浏览(48)
  • 设计模式—策略模式

    目录 一、定义 二、特点 三、优点 四、缺点 五、实例 六.涉及到的知识点 1、一个类里面有哪些东西? 2、类和实例 什么是类? 什么是实例? 什么是实例化? 3、字段和属性 什么是字段? 属性是什么? 属性怎么用呢? 属性有什么作用? 静态属性是什么? 属性和字段的公有

    2024年02月10日
    浏览(52)
  • 《设计模式》策略模式

    定义 : 又叫作 政策模式,将定义的一系列算法封装起来,使得它们之间可以互相替换,从而让算法的变化不影响到使用算法的用户 。 属于 行为型 模式。 策略模式的组成角色 : 环境类(Context) : 环境类是使用算法的角色 ,用来操作策略的上下文环境,屏蔽高层模块(客户

    2024年02月01日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包