基于Springboot注解的策略模式
释义
策略模式和多态很相似
可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行。
实现
上代码:
- 定义一个统一的接口:
|
1
2
3
4
5
|
public interface CalcStrategy { void calc(String ql); } |
定义几个实现类
|
1
2
3
4
5
6
7
8
|
@Servicepublic class HelloService implements CalcStrategy { @Override public void calc(String ql) throws SupportPortalException { System.out.println("hello : " + ql); }} |
|
1
2
3
4
5
6
7
8
|
@Servicepublic class WorldService implements CalcStrategy { @Override public void calc(String ql) throws SupportPortalException { System.out.println("world : " + ql); }} |
- 定义一个策略类
|
01
02
03
04
05
06
07
08
09
10
|
@Componentpublic 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); }} |
- 来个测试类
|
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.
上面例子中
|
1
2
|
@Autowired private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>(); |
会把所有实现了CalcStrategy接口的类,放入这个map中,key是这些实现类bean的名称
- 策略
|
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注解的策略模式的更多相关文章
- springboot中使用自定义注解实现策略模式,去除工厂模式的switch或ifelse,实现新增策略代码零修改
前言 思路与模拟业务 源码地址 https://gitee.com/houzheng1216/springboot 整体思路就是通过注解在策略类上指定约定好的type,项目启动之后将所有有注解的typ ...
- Springboot中实现策略模式+工厂模式
策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式? 具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELS ...
- 干货!基于SpringBoot的RabbitMQ多种模式队列实战
目录 环境准备 安装RabbitMQ 依赖 连接配置 五种队列模式实现 1 点对点的队列 2 工作队列模式Work Queue 3 路由模式Routing 4 发布/订阅模式Publish/Subsc ...
- 在商城系统中使用设计模式----策略模式之在spring中使用策略模式
1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...
- Java 设计模式--策略模式,枚举+工厂方法实现
如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...
- 基于Spring实现策略模式
背景: 看多很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案:这个方案主要是看了一些开源rpc和Spring相关源码后的一些思路,所以在此进行总结 首 ...
- SpringBoot结合策略模式实战套路
1. SpringBoot结合策略模式实战套路 1.1. 前言 我们都知道设计模式好,可以让我们的代码更具可读性,扩展性,易于维护,但大部分程序猿一开始都学过至少一遍设计模式吧,实战中不知用到了几成. ...
- 基于 普通及Lambda方式实现策略模式
什么是策略模式 策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案.比如如何使用不同的条件(比如苹果的重量,或者颜色 )来筛选库存中的苹果.你可以将这一模式应用到更广泛的领域 , ...
- 策略模式+注解 干掉业务代码中冗余的if else...
前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解. 一.业务 ...
随机推荐
- Delphi 通过脚本 在 设计期 改 控件name 属性
program ScriptRenameZL; uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialog ...
- c#学习笔记06——XML
XML概述:eXtensible Markup Language,可扩展标记语言.网络应用开发的一项新技术.同HTML一样是一种标记语言,但是数据描述能力要强很多.XML具有描述所有已知未知数据的能力 ...
- 1. 模块化的引入与导出 (commonJS规范 和ES6规范)
node组件导出模块 node一般用commonJS规范 可以通过module.exports导出自己写的模块 这样其他的js文件就可以引用并使用这个模块 module.exports = { log ...
- 套接字详解(socket)
用户认为的信息之间传输只是建立以两个应用程序上,实际上在TCP连接中是靠套接字来作为他们连接的桥梁. 那么什么是套接字呢? TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做 ...
- 2019收藏盘点(编程语言/AI/面试/实用工具)
2020.1.5更新 我看过的后面会加上评价 编程学习 java开源项目汇总: https://github.com/Snailclimb/awesome-java 大数据学习入门: https:// ...
- Activity组件(三):通过对象实现信息添加及展示
在对组件进行注册时,只注册了EditText,却忘记了Button,导致程序一直闪退 输入信息 点击添加 成功跳转页面,并将数据传递 User.java package com.example.reg ...
- 吴裕雄--天生自然 JAVA开发学习:接口
[可见度] interface 接口名称 [extends 其他的接口名] { // 声明变量 // 抽象方法 } import java.lang.*; //引入包 public interface ...
- unity学习 5.x打包
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor; publi ...
- ZJNU 1129 - The sum problem——中级
枚举区间可能的长度len,将m减去1~len构成的序列和后如果结果是len的倍数,则可以构成答案区间. /* Written By. StelaYuri */ #include<stdio.h& ...
- ipv6 mac地址转化为linklocal地址
mac 3c:32:66:67:dd:46 linklocal地址 前六位固定 fe80:: 第七位 mac地址第一个byte进行如下计算 (byte) ((byte) (macbyte &am ...