参考资料:https://www.bilibili.com/video/av57936239?p=60
适配器模式(Adapter Pattern)将某个接口转换成客户端希望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配而不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
适配器模式属于结构型模式
主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
例如,现在有一个提供5V电压充电的接口:
// 使用5V充电
public interface Charge5V {
void charging();
}
充电宝类实现了该接口:
// 充电宝
public class MobilePower implements Charge5V {
@Override
public void charging() {
System.out.println("使用充电宝给手机充电(5V)");
}
}
然后手机可以充电:
// 手机
public class Phone {
public void charge(Charge5V c) {
c.charging();
}
public static void main(String[] args) {
Phone phone = new Phone();
MobilePower mobilePower = new MobilePower();
phone.charge(mobilePower);
}
}
现在有一个插座类,输出220V电压
// 插座
public class Socket{
public void chargingWith220V() {
System.out.println("使用插座直接充电(220V)");
}
}
插座类也想给手机充电,但是因为接口类型不匹配,不能充电
// 充电器
public class ChargerAdapter extends Socket implements Charge5V {
@Override
public void charging() {
chargingWith220V();
System.out.println("转化为5V");
}
}
然后插座通过使用充电器来给手机充电:
// 手机
public class Phone {
public void charge(Charge5V c) {
c.charging();
}
public static void main(String[] args) {
Phone phone = new Phone();
ChargerAdapter chargerAdapter = new ChargerAdapter();
phone.charge(chargerAdapter);
}
}
使用类适配器的注意细节:
简介:
仍然使用上面手机充电的例子,修改适配器:
// 充电器
public class ChargerAdapter implements Charge5V {
private Socket socket;
public ChargerAdapter(Socket socket) {
this.socket = socket;
}
public void charging() {
socket.chargingWith220V();
System.out.println("转化为5V");
}
}
在Phone调用:
// 手机
public class Phone {
public void charge(Charge5V c) {
c.charging();
}
public static void main(String[] args) {
Phone phone = new Phone();
Socket socket = new Socket();
ChargerAdapter chargerAdapter = new ChargerAdapter(socket);
phone.charge(chargerAdapter);
}
}
UML类图:
简介
例如现在有一个接口Interface1
:
public interface Interface1 {
void m1();
void m2();
void m3();
void m4();
}
现在有一个Client
只想使用m1
方法
public class Client {
public void solve(Interface1 i1){
i1.m1();
}
}
于是就可以新建一个抽象适配器,让其实现Interface1
:
public abstract class ClientAdapter implements Interface1 {
@Override
public void m1() { }
@Override
public void m2() { }
@Override
public void m3() { }
@Override
public void m4() { }
}
现在在使用Client
的时候就可以使用ClientAdapter
,只需重写方法m1
即可
public static void main(String[] args) {
Client client = new Client();
Interface1 interface1 = new ClientAdapter() {
@Override
public void m1() {
System.out.println("ClientAdapter.m1");
}
};
client.solve(interface1);
}