释义

策略模式和多态很相似

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

实现

上代码:

  • 定义一个统一的接口:
[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. linux的centos设置静态网络

    这个是该自己的网络排至,具体的分析,自己以后再研究 http://www.centoscn.com/CentOS/config/2015/0227/4753.html

  2. oracle的用户、权限、表空间的管理

    1.创建表空间 create tablespace test1_tablespace datafile 'test1file.dbf' size 10m; 2.创建临时表空间 create tempo ...

  3. Maven--优化依赖

    Maven 会自动解析所有项目的直接依赖和传递依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在.在这些工作之后,最后得到的那些依赖 ...

  4. JetBrains Phpstorm 、 PyCharm 2019 最新破解码亲测可用

    Phpstorm 2019 破解码最新亲测可用 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1lIjoiSmV0cyBHc ...

  5. macbook 一些php相关操作

    开启php: https://jingyan.baidu.com/article/67508eb434539f9cca1ce4da.html 配置多虚拟主机:  https://jingyan.bai ...

  6. 5)PHP,可变变量

    所谓可变变量,就是一个变量的名,又是一个变量. 可变变量的语法是php的很特殊的语法——其他语言中少见. $v1 = “abc”; //这是一个字符串变量,其内容是字符串“abc” $abc = ; ...

  7. PAT甲级——1001 A+B Format (20分)

    Calculate a+b and output the sum in standard format – that is, the digits must be separated into gro ...

  8. Jmeter学习前提:Jmeter安装

    一.Jmeter下载 1. 前提:已经安装 jdk8+ 1.1 JDK下载 a. 进入jdk8+下载地址:https://www.oracle.com/technetwork/java/javase/ ...

  9. iso镜像文件的挂载和yum库的搭建

    挂载镜像文件 1.上传镜像文件到服务器(或电脑)的某一目录下   如:(/media/rpm_pack/rhel...iso) 2.root 用户下创建镜像文件挂载目录 mkdir  /mnt/vcd ...

  10. Docker相关学习地址

    菜鸟教程:http://www.runoob.com/docker/docker-image-usage.html 官方文档:https://docs.docker.com/