一、         什么是策略模式

策略模式的定义/含义:策略本身就是为了实现某一个目标而采取的一种工作方式,因此只要能够达成目标,则采取哪一种策略都可以;因此多种实际的策略之间是相互平行的。

注意:策略模式与模板模式是不同的,模板模式是定义了一个骨架(会有很多个步骤,其中可能包含必选和可选步骤,步骤之间可能会有一定的顺序,模板模式在顶级骨架中可能会有部分实现,也可将部分实现延迟到子类中,例如:TestCase的过程,一般都包含setUp、testCase、tearDown操作,testCase需要子类自行实现,setUp和tearDown可以直接通过super来进行调用;备注:模板模式后面会再专门整理,可能该部分内容会做更新),模板模式整体构成了一个完整的过程/算法,可对其中的某些步骤进行自行定制处理,而策略模式是调用者独立于具体的策略算法,每一种具体策略自身就是完整的,策略A与策略B之间可以自行替换,对调用者来说,不关注具体是通过策略A实现的还是B实现的,通过引用传入上下文,即可按照策略执行达到目标(策略可以理解为:殊途同归)

因此,在很多场景下都可以使用到策略模式,以大家熟悉的业务场景为例:比如支付方式的选择。

在Spring中,实例化对象的时候用到了Strategy模式,图示如下所示:

在上图中:InstantiationStrategy为抽象接口,SimpleInstantiationStrategy实现接口,但是在方法instantiate中进行判断,针对bd中没有MethodOverrides的,直接通过jdk反射进行构造函数调用,而针对有需要针对方法做MethodOverrides的,则可以通过另一种方式处理,在SimpleInstantiationStrategy中是通过:instantiateWithMethodInjection()方法处理的,在CglibSubclassingInstantiationStrategy中对该方法做了override实现。CglibSubclassingInstantiationStrategy继承自SimpleInstantiationStrategy,对MethodInjection方法的实现如下:

@Override

protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,

      @Nullable Constructor<?> ctor, Object... args) {
// Must generate CGLIB subclass... return new CglibSubclassCreator(bd, owner).instantiate(ctor, args); }

通过static的class类CglibSubclassCreator进行instantiate操作,剩下的就是cglib内中的细节了,此处不分析。

策略模式中包含的部分是:(1)抽象策略InstantiationStrategy接口

(2)具体策略SimpleInstantiationStrategy,被继承后子类CglibSubclassingInstantiationStrategy,实现自抽象策略接口(3)上下文对策略的引用,在AbstractAutowireCapableBeanFactory中是通过new CglibSubclassingInstantiationStrategy赋值给InstantiationStrateg的引用,进而进行具体的方法调用,具体见下方代码:

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory

      implements AutowireCapableBeanFactory {

   /** Strategy for creating bean instances. */
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();}

(注意:这里一般是通过对抽象策略接口的引用,之后通过多实现的根据当时具体选择的策略内容进行调用实现)

二、         自写demo示例

根据上面提到的策略模式中需要的内容进行demo的编写,分别是:抽象接口、具体实现、上下文引用及效果展示:

抽象接口定义:

package strategytest.demo;

public interface Strategy {
PayInfo payForSometh();
}

其中PayInfo定义如下:

package strategytest.demo;

public class PayInfo {
String payType;
String payCode;
String payDesc; public PayInfo(String payType, String payCode, String payDesc) {
this.payType = payType;
this.payCode = payCode;
this.payDesc = payDesc;
} public String getPayType() {
return payType;
} public String getPayDesc() {
return payDesc;
} public String getPayCode() {
return payCode;
}
}

具体策略接口实现:

package strategytest.demo;
public class ZhiFuBaoPay implements Strategy {
@Override
public PayInfo payForSometh() {
System.out.println("调用支付宝支付功能,根据返回值进行PayInfo类信息的设置");
PayInfo zhifubaoPayInfo= new PayInfo("支付宝", "0", "支付成功");
return zhifubaoPayInfo;
}
}

多个具体策略接口实现方式与上类似

上下文引用:

package strategytest.demo;
public class StrategyUse {
public static void main(String[] args) {
Strategy strategy = new WeiXinPay();
PayInfo payinfo = strategy.payForSometh();
System.out.println(payinfo.getPayType() + "," + payinfo.getPayCode() + "," + payinfo.getPayDesc());
}
}

结果如下:

参考文章:Spring中的各种模式的介绍:https://www.jianshu.com/p/3ea48ecd7178  ——》这是策略模式的,然后也有其他的模式,都可作为参考

【Spring源码解析】—— 策略模式在Spring中的应用的更多相关文章

  1. Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  2. spring 源码解析

    1. [文件] spring源码.txt ~ 15B     下载(167) ? 1 springн┤┬вио╬Ш: 2. [文件] spring源码分析之AOP.txt ~ 15KB     下载( ...

  3. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析

    我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了 ...

  4. Spring源码解析之ConfigurationClassPostProcessor(二)

    上一个章节,笔者向大家介绍了spring是如何来过滤配置类的,下面我们来看看在过滤出配置类后,spring是如何来解析配置类的.首先过滤出来的配置类会存放在configCandidates列表, 在代 ...

  5. Spring源码解析——循环依赖的解决方案

    一.前言 承接<Spring源码解析--创建bean>.<Spring源码解析--创建bean的实例>,我们今天接着聊聊,循环依赖的解决方案,即创建bean的ObjectFac ...

  6. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  7. Spring源码解析系列汇总

    相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...

  8. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  9. Spring源码解析之PropertyPlaceholderHelper(占位符解析器)

    Spring源码解析之PropertyPlaceholderHelper(占位符解析器) https://blog.csdn.net/weixin_39471249/article/details/7 ...

  10. Spring源码解析 | 第一篇 :IntelliJ IDEA2019.3编译Spring5.3.x源码

    前言 工欲善其事必先利其器.学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境.这样方便我们在本地环境添加注释.断点追踪.查看类或接口的继承关系等等,更加高效的学习Spring源码.个 ...

随机推荐

  1. Android 4.0屏蔽式多点触摸

    比方这张图.我想不接或者接单,二者仅仅能点一个,不能同一时候点击,否则会造成混乱.我们仅仅要在嵌套他们俩的布局中增加这么一段话: android:splitMotionEvents="fal ...

  2. 人活着系列Tanya和蔡健雅猪 (floyd)

    人活着系列之芳姐和芳姐的猪 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 芳姐特别喜欢猪,所以,她特意养了m个猪圈,顺便在k条无向边,每条边有都有起点v ...

  3. 【msdn wpf forum翻译】TextBox中文本 中对齐 的方法

    原文:[msdn wpf forum翻译]TextBox中文本 中对齐 的方法 原文链接:http://social.msdn.microsoft.com/Forums/en-US/wpf/threa ...

  4. UwpDesktop!WPF也能开发Surface Dial

    原文:UwpDesktop!WPF也能开发Surface Dial 前段时间巨硬发布了一款新的输入设备Surface Dial,配合Surface Studio使用简直炫酷到没朋友. 本人由于公司业务 ...

  5. iOS 自定义UIButton

    工作中有一个点击button更新button上文案的需求,用自定义了button可以很简单的实现的这个需求 首先写个自定义的button CustomButton.h #import <UIKi ...

  6. Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果

    原文:Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果  [函数名称] RGB分量调整         RGBAdjustProcess(WriteableBitmap  ...

  7. WPF常用第三方控件

    NLog日志控件: Install-Package NLog.Config Mysql数据库控件: Install-Package Mysql.Data 最新版本只支持.net 4.5.2及以上版本, ...

  8. 浅谈.NET(C#)与Windows用户账户信息的获取

    原文:浅谈.NET(C#)与Windows用户账户信息的获取 目录 1. 用户账户名称 - 使用Environment类 2. 用户账户信息 - 使用WindowsIdentity和IdentityR ...

  9. 微信小程序把玩(十三)progress组件

    原文:微信小程序把玩(十三)progress组件 进度条描述的是一种加载的状态,比如软件升级下载进度, 视频,图片下载进度- 主要属性: wxml <progress percent=" ...

  10. EF CodeFirst数据迁移与防数据库删除

    1 开启migrations功能 enable-migrations -force 2 添加迁移版本 add-migration 名称后缀 我们每次修改实体后,都应该使用这个add-migration ...