释义

策略模式和多态很相似

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

实现

上代码:

  • 定义一个统一的接口:
[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. LeetCode——48. 旋转图像

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  2. @EnableWebMvc WebMvcConfigurer

    Spring注解@EnableWebMvc使用坑点解析 https://blog.csdn.net/zxc123e/article/details/84636521 @EnableWebMvc,Web ...

  3. Unity中的事件监听

    Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值.如下图所示: 先以PointerClick为例.这个是用于某点点击事件.其他事件都可 ...

  4. POJ 3273 Monthly Expense二分查找[最小化最大值问题]

    POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...

  5. 三、NOSQL之Memcached缓存服务实战精讲第二部

    1.Memcached服务安装 Memcached的安装比较简单,很多平台都是支持Memcached,常见的有:Linux .Windows 服务端端:                cd /home ...

  6. socker通信-struct模块-粘包问题

    Socket概念 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对 ...

  7. UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释(转)

    layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————- - (voi ...

  8. Clairaut 定理 证明

    (Clairaut 定理)设 $E$ 是 $\mathbf{R}^n$ 的开子集合,并设 $f:\mathbf{E}\to \mathbf{R}^{m}$ 是 $E$ 上的二次连续可微函数.那么对于一 ...

  9. [JS]實作LinkedList鏈結串列

    由於自身資料結構的基礎薄弱,買了一本JavaScript資料結構與演算法實作的書來看,重新把LinkedList鏈結串列學習了一遍,並用JS實作出來. LinkedList鏈結串列 要存放多個元素,最 ...

  10. 34)PHP,PHP从数据库读取数据并在html中显示

    首先是我的数据库截图: 然后展示我的php文件: b.php文件: <?php $link= mysqli_connect('localhost','root','root'); // mysq ...