学习路径:https://coding.imooc.com/class/270.html
-
前言
适配器模式、外观模式、装饰者模式都存在语义上的共同点。装饰者模式和外观模式的区别:适配器模式的粒度与外观模式的粒度不同,适配器可以小到适配一个方法,但是外观模式是对子系统之间的封装。
-
应用场景
- Spring架构中Handler拓展的时候的源码实现
- 不是软件设计阶段考虑的设计模式,是维护阶段,适配不同产品、不同厂家造成功能类似但是接口不相同的情况下使用。
AC220 ac220 = new AC220();
// 原本的电压
ac220.outputAC220();
// 需要5V的直流电的时候直接使用适配器
DC5 dc5 = new PowerAdapter();
// 这个适配器里面已经包含了AC220的实例,屏蔽了交流电的外部表现,用户直接用5V直流电就好了
dc5.outputDC5V();
// 以220V交流电适配为5v直流电为例子
public class AC220 {
public int outputAC220(){
int output = 220;
System.out.println("输出交流电" + output);
return output;
}
}
public interface DC5 {
int outputDC5V();
}
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220();
// 变压器
int adapterOutput = adapterInput/44;
System.out.println("使用PowerAdapter输入AC:" + adapterInput
+ " 使用PowerAdapter输出DC:"+adapterOutput);
return adapterOutput;
}
}
- 拓展
Spring 的Controller的最终实现类就是一个需要适配的类,Controller有许多实现类,springMVC HandlerAdapter也对应了许多Adapter实现类. 不同的Handler会触发不同的HandlerAdapter。 所以增加一个自定义Controller的时候只需要增加一个Controller的实现类,和HandlerAdapter即可,使用的方式更原来相同。约定大于配置,提高架构稳定。