深入浅出设计模式——策略模式
1.策略模式介绍
2.用代码演示策略模式
3.总结
4.在spring源码中,策略模式的应用
1.策略模式介绍
定义:
策略模式,
1)定义算法族,分别封装起来,让他们之间可以相互转化,此模式让算法独立于使用算法的客户。
2)这算法体现了几个设计原则,
第一、把变化的代码从不变的代码分离出来;
第二、针对接口编程而不是针对具体类(定义了策略接口)
第三、多用组合/聚合,少用继承。
2)简单地说,
我们再拿积分需求举例(积分需求真的可以套用各种设计模式,所以大家接到这类需求的时候,千万别用if else这种写法来完成整个积分需求,笔者刚出大学的时候,工作第二个月接到的就是积分需求,当时就用了工厂+模板方法+策略模式进行实现。)
假设我们现在在完成任务奖励积分的时候,分了很多种任务类型,分别有不同的奖励算法,这个时候我们就可以使用策略模式。
2.用代码演示策略模式
我们先定义一个算法的抽象类模型:
public interface IIntegralAction {
//增加/扣除积分前的检查操作,如检查是否开户,检查用户是否异常,检查奖励/使用数是否异常等等
void preCheck(String userId);
//执行具体的增减逻辑
void excute(String userId);
//执行后置逻辑,如更新数据时间等等操作
void after(String userId);
}
然后,我们就可以根据奖励积分的算法逻辑不一样,来实现这个接口。
再定义一个抽象类,来实现这个抽象接口,并写好前置和后置的逻辑,设定好调用顺序。
public class Action101 implements IIntegralAction{
@Override
public void preCheck(String userId) {
//检查逻辑
}@Override
public void excute(String userId) {
//执行逻辑
}@Override
public void after(String userId) {
//后置处理逻辑,比如更新时间
}
}
【深入浅出设计模式——策略模式】然后进行编写就可以了。
3.总结
策略模式就是一种封装一系列算法的方法,每一种算法一个类,所有的这些类完成的都是同一类型的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
我们可能觉得它和之前介绍的模板方法设计模式有点相似,其实它们的区别在于:
模板方法设计模式中,定义算法步骤的主题在抽象的父类中
策略模式中,调用模板方法的主题则在客户端
而在实际编程中,因为各个具体策略实现类之间难免存在一些相同的逻辑,为了避免重复的代码,我们常常使用抽象类来担任Strategy的角色,在里面封装公共的代码,因此,在很多应用的场景中,在策略模式中一般会看到模版方法模式的影子。
4.在spring源码中,策略模式的应用
我们知道在spring中,我们要使用容器管理对象,一般都要先定义信息,可能有xml的,可能有注解的,可能有json的:
文章图片
这个时候spring先回把配置文件读取到容器里面去,但是不同的文件读取方式不同,这个时候就使用了策略模式。定义一个抽象的读取方法,然后采用不同的实现。
文章图片
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术