1.产生背景
- 为什么需要适配器模式
现在很多笔记本已经取消了有线网口,所以如果还想使用网线连接网络只能使用其它方式:
这个USB网线转换接口,就是一个适配器,它连接两个不直接对接的对象
2.概念
是作为两个不兼容的接口之间的桥梁。它结合了两个独立接口的功能。
本质: 有两个不兼容的对象A,B需要对接,统过引入一个中介对象,这个中介对象一边兼容A,一边兼容B, 以实现A,B通过中介对象进行对接;
3.目的
将一个类的接口转化成客户希望的另一个接口,让不兼容的对象之间可以间接调用
4.解决方案
本质:引入第三方中介类,这个类分别满足不兼容的两边接口,并通过中介内部把不兼容的数据进行转换处理,以适应两边;
- 引入中介对象
- 中介对象分别实现两个不兼容的接口(被调、调用)
- 中介对象内部实现两个不兼容接口的数据转换、处理、清洗;
//调用方
public class Client{
@Autowired
IOperater opt;
void invoke(){
opt.operate("laoYang",18);
}
}
//被调用接口
public interface IOperater{
void operate(String name,Integer age);
}
//需要被适配的类
public class Adaptee{
public void operate(String name,String age){
System.out.println("我的名字是:" + name + ",今年年龄:" + age );
}
}
//适配器
public class Adapter implements IOperater{
@Autowired
Adatee adatee;
public void operate(String name,Integer age){
String ageTemp = age.toString();
adatee.doSomething(name,ageTemp);
}
}
5. 类图
6.优缺点
优点:
将两个类联系起来
最终目的是把两个不兼容的对象连接起来,是不兼容的桥梁;松耦合
不兼容的两方均不需要修改变更,就可以相互调用;扩展性高
只需要增加不同的适配器,可以与”任何”不兼容的一方对接;
最核心的目的:在不修改原代码的情况下,作为桥梁,连接不兼容的双方
缺点:
结构凌乱
本来面向抽象编程,但由于引入适配器(适配器本身可以面向抽象),被适配者则不面向抽象,导致代码不按规范,以及增加了过多的与业务无关的适配器,会导致结构和代码的凌乱;不能适配所有情况
java为单继承,因此只能适配一个适配类;不能完全不修改适配双方的代码
适配双方不在同一个项目,不是同一种编程语言,没有面向抽象编写,都有可能需要一方进行部分代码的修改;
7.应用场景
已经存在的历史系统需要对接,且双方都不愿意或不能变更自身
如:IBM早年提出的为了消除信息孤岛,打通各个现有系统时,由于各个系统的早期规划和设计并不相互依赖,因此并不能直接进行调用,此时,就可以通过“适配器”进行接口间的适配、转换、数据洗清;一方的发展不考虑另一方
如:spring Handler 包含实现了Controller接口,配置了@Controller注解的类,以及Servlet类;未来handler的种类可能还会更多;而这些handler的发展和产生,并不会考虑和依赖spring的发展,因此,spring是无法预测和硬编码对各种handler的调用;
此时,就可以考虑使用Adapter模式来提高Spring的扩展性;只需要让adapter面向接口编程,未来通过增加Adapter实例子,来实现spring与handler之间的调用;
8.现实案例
spring HandlerAdapter
9. 注意事项
万不得一时再使用Adapter,否则,应该整体设计和规划,尽可能的面向抽象编程,减少adapter的存在;