1、什么是适配器模式?
当一个类的接口,不满足客户端需要,需要进行拓展或者修改时,在保持原有接口的前提下,增加一个适配层,通过这个适配层,提供客户端需要的接口。
2、为什么要使用适配器模式?
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。主的目的是兼容性。
3、怎么使用适配器模式?
3.1. 首先介绍一下适配器模式的类型:
-
类的适配器模式
-
对象的适配器模式
3.2 类的适配器模式:
核心思想:有一个Source类,拥有一个方法需要适配。而目的接口是Target,通过Adapter类,将Source的功能拓展到Target里。
应用场景:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类(Source类),并实现新的接口。
有一个现有的翻译类(translates),可以将中文转换成英文。现在客户端需要将中文转换成俄文。
public class translates {
public void translatesZh2En(String input) {
... // 已有代码
}
}
正常的做法是在translates类中新增一个方法(translatesZh2Ru)
public class translates {
public void translatesZh2En(String input) {
... // 已有代码
}
public void translatesZh2Ru(String input) {
... // 新增代码
}
}
设计问题:扩展功能却修改了现有的translates类,违反了开闭原则。后续每次新增,都需要修改这个类,如果这个是一个三方件的jar包的源码类,那就更麻烦了。
利用类的适配器模式,采用如下方案实现:创建一个新类(translates2),继承原有的类(translates类),并实现新的接口(translatesInterface)。
public interface translatesInterface {
public void translatesZh2En(String input);
public void translatesZh2Ru(String input);
}
public class translates2 extends translates implements translatesInterface {
public void translatesZh2Ru(String input) {
... // 新增代码
}
}
方案的关键点:
- 新增接口类translatesInterface,对外提供统一接口;
- 新增translates2类,继承现有的translates类及translatesInterface接口,实现指纹认证功能;
优点:
- 无需改动现有业务类;
- 可复用现有业务类;
- 可灵活扩展;
3.3 对象的适配器模式:
核心思想:基本思路和类的适配器模式相同,只是将Adapter类作修改,不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题
应用场景:当希望将一个类转换成满足另一个新接口的类时,可以创建一个Wrapper类,持有原有类的一个实例,在Wrapper类的方法中,调用实例的方法。
还是上面的那个翻译类(translates),可以将中文转换成英文。现在客户端需要将中文转换成俄文,需要怎么用对象的适配器模式呢?
public class translates {
public void translatesZh2En(String input) {
... // 已有代码
}
}
利用对象的适配器模式,采用如下方案实现:创建一个新类(Wrapper),持有原有的类的一个实例(translates实例),调用实例的方法即可。
public class Wrapper{
private translates translates;
public Wrapper(translates translates) {
this.translates= translates;
}
public void translatesZh2En(String input){
translates.translatesZh2En(input);
}
public void translatesZh2Ru(String input){
... // 新增代码
}
}
public class translates {
public void translatesZh2En(String input) {
... // 已有代码
}
}
方案的关键点:
- 新增Wrapper类,持有原有类(translates)的实例。
- 在Wrapper类中,调用原有类(translates)的方法。
跟类的适配器模式相比的优点:
- 没有使用java的继承,有更多的拓展性。
- “合成复用原则”,在系统中尽量使用关联关系来替代继承关系
更多内容请关注微信公众号“外里科技”
官方公众号 | 外里科技 |
运营公众号 | 英雄赚 |
微信 | wxid_8awklmbh1fzm22 |
1247408032 | |
开源代码 | https://gitee.com/B_T/beimi |