1.介绍
(1)适配器模式将某个类的接口转换为客户端期望的另一个接口,主要目的是兼容性,让两个不能一起工作的类可以协同工作,别名为包装器。
(2)属于结构性模式
(3)分为类适配器、对象适配器、接口适配器
2.工作原理
(1)适配器模式:将一个类的接口转换为另一个类的接口,让原本不兼容的类可以兼容
(2) 从用户的角度是看不到适配者的,是解耦的
(3)用户调用适配器转换出来的目标接口方法,适配器再调用被适配的相关接口方法
3.类适配器模式
java
public class VoltApdapter extends Vol220V implements Vol5V{
public int output5V(){
return output220V() / 44;
}
}
缺点:类适配器需要继承src类(少用继承,多用组合)且src类中的方法在Adapter中会暴露出来,增加了使用成本。
优点:因为继承了src,所以可以根据需求重写src类中的方法,使Adapter的灵活性增强
4.对象适配器模式
基本思路和类适配器相似,但是不再继承src类,而是拥有src类的实例,即:持有src类,实现dist类接口
java
public class VoltApdapter implements Vol5V{
private Vol220V vol220V;
public VoltApdapter(Vol220V vol220V){
this.vol220V = vol220V;
}
public int output5V(){
int result = 0;
if(vol220V != null){
result = vol220V.output220v / 44;
}
return result
}
}
优点:使用成本低,更灵活
5.接口适配器模式
当不需要全部实现接口提供的方法时,可以先设计一个抽象类的实现接口,为该接口中每个方法提供一个默认实现,那么该类的子类可以选择性覆盖父类中的方法来实现需求
java
// 对Interface4进行默认实现
public class AbsApapter implements Interface4{
public void m1(){}
public void m2(){}
}
public class Client{
public void main(String [] args){
@override
public void m1(){
sout('m1')
}
}
}
优点:使用成本低,更灵活
6.前端
js
class Adapte{
test(){
return '德国插头'
}
}
class Target{
constructor(){
this.adaptee = new Adapte()
}
test1(){
return `${this.adaptee.test()}中国插头`
}
}
场景
(1)封装旧接口
(2)适配不同格式的数据
7.设计模式验证
(1)将旧接口和使用者进行分离
(2)符合开放封闭原则