分类
- 类适配器模式
- 对象适配器模式
类适配器是由继承关系构成,对象适配器是聚合或组合的关系构成所以类适配器耦合性较高,使用较少
角色/结构
- 目标接口:我们中国的手机充电器
- 适配者类:欧洲那边已有的欧洲标准的插座
- 适配器类:可以把我们的手机充电器调整到可以用欧洲插座的适配器
类适配器
个人见解
- 代码实现上:其实就是适配器类起了"和亲"的作用,通过同时实现一方,又继承另一方的方式来实现,既是适配者类又是目标接口类,当然实现的那方必须是目标接口类(毕竟你可以直接通过继承来调用它的方法)
- 类的抽象上:其实适配者类和目标接口在概念上可以互换!(当然得在双方都有接口和实现类的情况上)(警示1.需要类在抽象是否清晰定义2.我们能否利用这种特性,实现双头蛇效果)
问题:
- 不符合合成复用原则
- 必须在适配者类有接口的情况下
对象适配器
解决了类适配器的问题
区别把目标接口类聚合在我们的适配器类里面,也即是代码上所谓的"适配"变成通过实现适配者接口或者类然而实际上调用目标接口类来实现
/**
* @author:天才玩家M
* @date:2023/8/1 20:31
* @description:适配器类
*/
public class TFAdapterSD implements SDCard {
private TFCard tfCard;
public TFAdapterSD(TFCard tfCard) {
this.tfCard = tfCard;
}
@Override
public String readSD() {
System.out.println("通过Adapter适配中,调用READ");
return tfCard.readTF();
}
@Override
public void writeSD(String msg) {
System.out.println("通过Adapter适配中,调用WRITE");
tfCard.writeTF(msg);
}
}
接口适配器
使用场景
只需要对某两个类之间的一个方法进行适配
与老师代码的不同
老师的是要通过一个抽象类来默认实现原先方法,这种方法自然可以,不过无形中复杂了类之间的关系与结构,所以我直接用接口的默认方法来实现了
然后adapter具体需要适配哪个方法,就需要再去具体实现一下
应用场景
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。