一、定义

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。由于spring中我们需要注册对象,不能通过直接通过 **new** 来创建策略实现类,需要使用工厂模式来获取bean对象

二、实现方法

1.策略模式接口

public interface StrangeService {int executeStrange(int id, double credit);}

2.定义策略模式的实现类

StrangeActivityAddServiceImpl和、StrangeActivitySubServiceImpl

StrangeActivityAddServiceImpl

@Service
@Slf4j
public class StrangeActivityAddServiceImpl implements StrangeService{@Autowiredprivate ActivityMapper activityMapper;@Overridepublic int executeStrange(int id, double credit) {log.info("传入参数:id=[{}],credit=[{}]",id,credit);Activity activity=activityMapper.selectByPrimaryKey(id);activity.setCredit(activity.getCredit()+credit);int res=activityMapper.updateByPrimaryKeySelective(activity);System.out.println("增加积分策略结果:"+res);return res;}
}

StrangeActivitySubServiceImpl

@Service
@Slf4j
public class StrangeActivitySubServiceImpl implements StrangeService{@Autowiredprivate ActivityMapper activityMapper;@Overridepublic int executeStrange(int id, double credit) {log.info("传入参数:id=[{}],credit=[{}]",id,credit);Activity activity=activityMapper.selectByPrimaryKey(id);activity.setCredit(activity.getCredit()-credit);int res=activityMapper.updateByPrimaryKeySelective(activity);System.out.println("增加积分策略结果:"+res);return res;}
}

3.策略模式上下文

用于获取注入的策略实现类的bean对象

(1)通过ConcurrentHashMap的形式获取注入的对象

@Service
public class StrangeContext {@Autowiredprivate final Map<String, StrangeService> map = new ConcurrentHashMap<>();/*** 根据服务实现类名称获取对应的服务* @param serviceName* @return*/public StrangeService strangeService(String serviceName) {StrangeService strangeService = map.get(serviceName);if (strangeService == null) {throw new RuntimeException("未定义此策略实现类!");}return strangeService;}}

(2)通过SpringContextHolder重写ApplicationContextAware获取上下文对象获取指定bean

StrangeService strangeService=SpringContextHolder.getBean(StrangeActivityConstant.STRANGE_CREDIT_ADD_SERVICE,StrangeActivityAddServiceImpl.class);
strangeService.executeStrange(1,1);

4.策略模式实现类常量名

public interface StrangeActivityConstant {String STRANGE_CREDIT_ADD_SERVICE = "strangeActivityAddServiceImpl";String STRANGE_CREDIT_MULTIPLY_SERVICE = "strangeActivityMultiServiceImpl";String STRANGE_CREDIT_SUBTRACT_SERVICE = "strangeActivitySubServiceImpl";
}

5.使用方式

在spring中注入上下文StrangeContext对象,然后执行方法获取currentHashMap中策略实现类Impl的bean对象,再调用策略实现类Impl的具体实现方法

@Autowired
private StrangeContext strangeContext;@RequestMapping("/test15")
public void testStrangePattern(){//为活动id=1的活动增加积分
strangeContext.strangeService(StrangeActivityConstant.STRANGE_CREDIT_ADD_SERVICE).executeStrange(1,9);//为活动id=3的活动减去积分
strangeContext.strangeService(StrangeActivityConstant.STRANGE_CREDIT_SUBTRACT_SERVICE).executeStrange(3,1);
}

Spring中策略模式实现方法相关推荐

  1. Spring 中策略模式的 2 个经典应用

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转自头条号程序汪汪 背景 程序员在项目实战中,策略模式用的非常多. 学习目标 会在Spring项目中运 ...

  2. Spring 中策略模式的 2 个经典应用,可以用来怼面试官了

    一.背景 程序员在项目实战中,策略模式用的非常多. 二.学习目标 会在Spring项目中运用策略模式 三.代码例子 废话不多说,Java的软件开发们注意啦,开车啦! 下面是一个查询业务使用策略模式的案 ...

  3. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  4. 原来使用 Spring 实现策略模式可以这么简单!

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else. 比如我们生活中的场景:买东西结账可以使用微信支付.支付宝支付或者银行 ...

  5. Spring实现策略模式

    通过Spring实现策略模式 当程序中使用太多的if/else/switch来处理不同类型的业务时,会变得极难维护,通过策略模式可以更容易的实现业务扩展和维护. 标准策略模式介绍 比如说对象的某个行为 ...

  6. spring AOP策略模式使用

    1.策略模式 The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inte ...

  7. 策略模式及Spring整合策略模式

    策略模式 抽象策略类 interface SortService{int[] sort(int arr[]);} 具体策略类 class InsertionSortServiceImpl implem ...

  8. spring 中 ApplicationContext 的 refresh 方法做了什么

    refresh 方法可以说是Spring中核心的一个方法了,通过这个方法可以获取bean的定义.创建添加bean到spring容器中一个其它扩展功能.记录下相关内容. 有个问题:refresh方法为什 ...

  9. (转)Spring中Singleton模式的线程安全

    不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...

最新文章

  1. 腾讯研究院发布:《人工智能+制造产业发展研究》报告
  2. php表格 单元格,如何更改PHPWord表格单元格高度?
  3. OAF页面查找数据源
  4. 让你博士毕不了业的十个最可能的原因
  5. boost::core模块实现交换string
  6. linux 全局搜索文件_Linux笔记之文件搜索1
  7. CMake 入门与进阶
  8. python中beautifulsoup是什么库_BeautifulSoup库详解(个人整理)
  9. Spark分布式集群的搭建和运行
  10. 5 计算机组成原理第四章 指令系统
  11. Linux centOS 硬盘分区挂载
  12. [原]go lang windows环境搭建
  13. CSS布局相关基本概念
  14. 使用linux批量引物设计,使用NCBI-ePCR和Primer3进行引物批量化设计
  15. 双十一,一群金融大脑去了趟苏州!
  16. D-Link DP-LINK302打印服务器WIN7版软件
  17. unity,通俗解释什么是协程
  18. FCoin回来了?起死回生凭借何种“妙法”?
  19. python读取oracle数据转换成json文件_python 读取网页json数据库中
  20. 如何使用JavaScript滚动到页面顶部?

热门文章

  1. c语言二维图形变换程序,【计算机图形学】3-2 二维几何变换根本代码
  2. 七十六、Python | Leetcode二分查找和分治算法系列
  3. 五十二、Java连接Mysql数据库
  4. 论文盘点:GAN生成对抗样本的方法解析
  5. 直播报名 | CUDA优化:高性能库cuBLAS使用指南
  6. 算法竞赛入门与进阶 (一)枚举
  7. memset 数组初始化
  8. 【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
  9. Spring Boot配置文件加载顺序
  10. 手写java数据库连接池,自定义实现数据库连接池,兼容springboot