theme: smartblue
highlight: atom-one-dark
前言
总所周知,策略模式是个好东西,他不仅是一种技术,在我看来更是一种思想。
what is 策略模式
策略模式就像一个工具箱,当我们遇到不同的场景,拿出不同工具。它的好处是
符合开闭原则还有单一原则,当我们需要对另外一种场景进行处理的时候,只需要去打造另一款工具,而不是在之前的工具去修改。
防腐层改造
what is 防腐层
我们在学习DDD的时候,会学习到防腐层。它主要功能是将第三方api进行隔离,这样不会跟内部系统进行强耦合,提高了可扩展性。
how to do it
场景
刚好在项目里头,有依赖第三方api,之前由于时间很赶,直接跟业务代码耦合在一起了,在最近时间比较充裕的时候,我们将它优化一下。
思路:采用防腐层,将外部api进行隔离开,采用api的形式进行实现,这样为后面的扩展提供良好的基础。
防腐层改造
首先是定义api,为了实现类通过该接口进行扩展。
public interface Facade {
/**
* 处理逻辑
*
*/
xx<?> dealWith();
/**
* 类型
*
* @return
*/
String getType();
}
然后我们来实现扩展类
@Service
public class xxFacade implements Facade {
@Override
xx<?> dealWith(){
//todo 做特定逻辑处理
}
}
编写设配器
@Service
public class Adapter {
@Resource
private List<Facade> facadeList;
private Facade getFacade(String xx) {
return facadeList.stream().filter(it -> it.getType().equals(xx)).findFirst().orElseThrow(() -> new BizException("没有找到实现类"));
}
public xx<?> dealWith(xx) {
return getFacade(xx).dealWith();
}
}
到这里我们看到,借助spring注入实例的方法,然后通过接口里头的type方法,来判断我们具体要拿出什么工具来解决问题。到此反腐层就改造完成✅
Nacos 插件
我们看下官网的文档,里面也有介绍Nacos插件这一块spi,如下图鉴权这一块的spi。接下来,我们来看下策略模式中里面的体现吧~
首先看到的是接口类,我们可以通过实现这个接口来扩展鉴权功能。
这里就是接口的一种实现类。
这里通过classload来将所有实现该接口的类塞到set里面,然后根据特定的标识来获取。
总结
策略模式很常见的设计模式,我们可以借助它来提高代码质量,提高系统的扩展性。