释义

策略模式和多态很相似

可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行。

实现

上代码:

  • 定义一个统一的接口:
[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
public interface CalcStrategy {
     
    void calc(String ql);
     
}

定义几个实现类

[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
@Service
public class HelloService implements CalcStrategy {
    @Override
    public void calc(String ql) throws SupportPortalException {
                System.out.println("hello : " + ql);
    }
 
}
[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
@Service
public class WorldService implements CalcStrategy {
    @Override
    public void calc(String ql) throws SupportPortalException {
                System.out.println("world : " + ql);
    }
 
}
  • 定义一个策略类
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
@Component
public class DataCalcStrategy {
    @Autowired
    private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>();
 
    public void calc(String type, String ql) {
        CalcStrategy calcService = calcStrategyMap.get(type);
        calcService.calc(ql);
    }
}
  • 来个测试类
[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
6
@Test
    public void contextLoads() throws SupportPortalException {
 
        dataCalcStrategy.calc("helloService", "666");
        dataCalcStrategy.calc("worldService", "777");
}

原理
@Autowired
在源码中写到

In case of a java.util.Collection or java.util.Map dependency type, the container will autowire all beans matching the declared value type. In case of a Map, the keys must be declared as type String and will be resolved to the corresponding bean names.

当Autowired注解在Collection 上时,会将所申明类的所有实现类都放在那个指定的Collection里;

如果Autowired和map使用的话呢,它将它bean的名称作为key,所有的bean作为value.

上面例子中

[JavaScript] 纯文本查看 复制代码
1
2
@Autowired
   private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>();

会把所有实现了CalcStrategy接口的类,放入这个map中,key是这些实现类bean的名称

  • 策略
[Pascal] 纯文本查看 复制代码
1
2
3
4
public void calc(String type, String ql) {
        CalcStrategy calcService = calcStrategyMap.get(type);
        calcService.calc(ql);
    }

这个方法会根据传进来的type(bean的名称),从map中取出具体实例,从而使用多态调用不同的方法。

更多java学习资料可关注:itheimaGZ获取

基于Springboot注解的策略模式的更多相关文章

  1. springboot中使用自定义注解实现策略模式,去除工厂模式的switch或ifelse,实现新增策略代码零修改

    前言 思路与模拟业务 源码地址 https://gitee.com/houzheng1216/springboot 整体思路就是通过注解在策略类上指定约定好的type,项目启动之后将所有有注解的typ ...

  2. Springboot中实现策略模式+工厂模式

    策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式? 具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELS ...

  3. 干货!基于SpringBoot的RabbitMQ多种模式队列实战

    目录 环境准备 安装RabbitMQ 依赖 连接配置 五种队列模式实现 1 点对点的队列 2 工作队列模式Work Queue 3 路由模式Routing 4 发布/订阅模式Publish/Subsc ...

  4. 在商城系统中使用设计模式----策略模式之在spring中使用策略模式

    1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...

  5. Java 设计模式--策略模式,枚举+工厂方法实现

    如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...

  6. 基于Spring实现策略模式

    背景: 看多很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案:这个方案主要是看了一些开源rpc和Spring相关源码后的一些思路,所以在此进行总结 首 ...

  7. SpringBoot结合策略模式实战套路

    1. SpringBoot结合策略模式实战套路 1.1. 前言 我们都知道设计模式好,可以让我们的代码更具可读性,扩展性,易于维护,但大部分程序猿一开始都学过至少一遍设计模式吧,实战中不知用到了几成. ...

  8. 基于 普通及Lambda方式实现策略模式

    什么是策略模式 策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案.比如如何使用不同的条件(比如苹果的重量,或者颜色 )来筛选库存中的苹果.你可以将这一模式应用到更广泛的领域 , ...

  9. 策略模式+注解 干掉业务代码中冗余的if else...

    前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解.   一.业务 ...

随机推荐

  1. tomcat启动极慢在linux生产环境

    在window环境下不会出现启动极慢的问题.   Tomcat启动极慢在生产环境,跟Weblogic一样   此外由于Weblogic创建域的时候使用的JDK是自带的jrockit,所以要解决WebL ...

  2. Single设计模式

    JavaSE基础中学习的single设计模式复习: * 单列设计模式概念理解:用程序实现在存储中只能有一个对象. *  * 恶汉式实现思路分析: * 1.如何实现类不能被其他人多次创建呢? * 实现: ...

  3. Photoshop和Halcon如何锐化彩色图像不伤其颜色

    锐化图像是摄影中的一步重要操作. 锐化是通过颜色提纯达到锐化的目的.一旦锐化过度,照片很容易就会出现不自然的色斑,或溢色效果. 我们以Photoshop中的“USM锐化滤镜”为例:(为了使效果明显,我 ...

  4. python-day3爬虫基础之下载网页

    今天主要学习了关于网页下载器的一些内容,下边做一下总结: 1.网页下载器,顾名思义,就是将URL所对应的网页以HTML的形式下载到本地,最终存储成本地文件或者还是本地内存字符串,然后进行后续的分析与处 ...

  5. SVN一直清理解决

    svn作为我们经常使用的版本管理服务器,在使用过程中经常需要通过clean up操作来完成本地文件与服务器文件信息及版本信息同步,然而有时会在执行清理命令时提示“清理失败,请执行清理”,并且提示的中文 ...

  6. python摄像头

    import cv2 cap = cv2.VideoCapture(0) i = 0 while 1: ret, frame = cap.read() k = cv2.waitKey(1) if k ...

  7. DocCms_2016 代码审计

    0x00 结构浏览 按照代码审计的惯例,拿到这款cms之后首先浏览了一下目录结构,在基本了解之后,首先进入/index.php,这里包含了两个文件:/admini/config/qd-config.p ...

  8. IE浏览器弹出的文件下载工具条实现自动另存为

    IE浏览器中如果有一个文件可以下载,用鼠标点击一下文件的超链接,会在IE浏览器下方出现一个工具条,工具条上主要有“打开” “保存”两个按钮. 如果点击“保存”按钮,会把附件保存到系统的“下载”或“Do ...

  9. spi设备描述过程

    一.spi通信 中控制器驱动及spi设备.spi设备驱动的关系入下图: 控制器驱动以及设备全志已经完成,在/driver/spi/spi--sunxi.c  中,打开源码文件可以看到spi控制器属于平 ...

  10. RedBlack-Tree(红黑树)原理及C++代码实现

    众所周知,红黑树是用途很广的平衡二叉搜索树,用过的都说好.所以我们来看看红黑树的是怎么实现的吧. 红黑树顾名思义,通过红与黑两种颜色来给每个节点上色.其中根结点和叶子结点一定是黑色的,并且红色结点的两 ...