适配器模式
1、将某个类的接口转换成客户端期望的另一个接口表示、主要目的为了兼容性,让原本无法匹配的类可以协同工作
2、构建型模式
类适配器模式
通过一个Adapter类来继承src
类(被适配对象),实现dst
类(输出对象)接口,完成src->dst
适配
Voltage220V
public class Voltage220V {
int output220V() {
System.out.println("输出电压220V");
return 220;
}
}
Voltage5V
public interface Voltage5V {
int output5V();
}
VoltageAdapter
public class VoltageAdapter extends Voltage220V implements Voltage5V{
@Override
public int output5V() {
int src = output220V();
int dst = src / 44;
System.out.println("通过适配器");
return dst;
}
}
phone
public class phone {
void charging(Voltage5V voltage5V) {
if (voltage5V.output5V() == 5) {
System.out.println("电压为5V,充电开始");
} else {
System.out.println("电压不为5V,充电失败");
}
}
}
client
public class client {
public static void main(String[] args) {
phone phone = new phone();
phone.charging(new VoltageAdapter());
}
}
对象适配器
1、Adapter类不在继承src类,将其继承关系改为聚合关系,解决兼容性问题(合成复用原则)
2、持有src类,实现dst接口
VoltageAdapter
public class VoltageAdapter implements Voltage5V {
//使用聚合方式,每次将被适配对象传入
Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int src = voltage220V.output220V();
int dst = src / 44;
System.out.println("通过适配器");
return dst;
}
}
Voltage220V
public class Voltage220V {
int output220V() {
System.out.println("输出电压220V");
return 220;
}
}
Voltage5V
public interface Voltage5V {
int output5V();
}
phone
public class phone {
void charging(Voltage5V voltage5V) {
if (voltage5V.output5V() == 5) {
System.out.println("电压为5V,充电开始");
} else {
System.out.println("电压不为5V,充电失败");
}
}
}
client
public class client {
public static void main(String[] args) {
phone phone = new phone();
//每次将被适配对象传进去,解决了兼容性
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
优点:
1、符合合成复用原则,使用组合替代继承,解决了适配器必须继承src的局限性
2、成本低,更加灵活
接口适配器
1、适用于一个接口不想使用其所有方法的情况
2、设计一个抽象类来继承接口,并实现所有接口为一个空方法,那么该抽象类的子类可以有选择的实现父类的某一个方法
Interface4
public interface options {
void options1();
void options2();
}
AbsAdapter
public abstract class AbsAdapter implements options {
@Override
public void options1() {
}
@Override
public void options2() {
}
}
A
public class A {
public static void main(String[] args) {
AbsAdapter method = new AbsAdapter() {
@Override
public void options1() {
System.out.println("使用了options1方法");
}
};
method.options1();
}
}
总结
- 三种命名方式,是根据 src 是以怎样的形式给到 Adapter(在 Adapter 里的形式)来命名的。
- 类适配器:以类给到,在 Adapter 里,就是将 src 当做类,
- 继承对象适配器:以对象给到,在 Adapter 里,将 src 作为一个对象,
- 持有接口适配器:以接口给到,在 Adapter 里,将 src 作为一个接口,实现