结构型模式
将某个类的接口转换成客户端期望的另一个接口,让原本因为接口不匹配而不能工作的类可以一起协同工作。
适配器模式一共分为3种
我们的家用电都是 220V,但是手机这种小型设备充电的时候无法使用 220V,它只需很低的电压即可,例如 5V,我们可以使用适配器模式,将 220V 电压转换成 5V 电压。
一个 Adapter
类,通过继承 Source
类,实现 Target
(目标)接口,完成 Source -> Target
的转换。
1、Source:一个已存在的类,需要对其进行适配
2、Target:转换的目标接口
3、Adapter:继承 Source 类,实现 Target 接口,并对其进行适配
4、Client:客户端,和 Target 接口协同
// 需要适配的类
public class Source {
public int output220V() {
int voltage = 220;
System.out.println("原电压:" + voltage + "V");
return voltage;
}
}
// 适配的目标接口
public interface Target {
int output5V();
}
// 适配器类,对Source和Target进行适配
public class Adapter extends Source implements Target {
@Override
public int output5V() {
int voltage = output220V() / 4;
return voltage;
}
}
public class Client {
public static void main(String[] args) {
Adapter adapter = new Adapter();
int voltage = adapter.output5V();
System.out.println("转换后电压:" + voltage + "V");
}
}
运行结果
原电压:220V
转换后电压:55V
适配器类 Adapter
持有 Source
类的对象,实现 Target
接口,完成 Source->Target
的适配。
1、Source:一个已存在的类,需要对其进行适配
2、Target:适配的目标接口
3、Adapter:适配器类,对 Source 和 Target 进行适配
4、Client:客户端,和 Target 接口协同
// 需要适配的类
public class Source {
public int output220V() {
int voltage = 220;
System.out.println("原电压:" + voltage + "V");
return voltage;
}
}
// 适配的目标接口
public interface Target {
int output5V();
}
// 适配器类,对Source和Target进行适配
public class Adapter implements Target {
// 关联关系——聚合
private Source source;
public Adapter(Source source) {
this.source = source;
}
@Override
public int output5V() {
int voltage = source.output220V() / 4;
return voltage;
}
}
public class Client {
public static void main(String[] args) {
Adapter adapter = new Adapter(new Source());
int voltage = adapter.output5V();
System.out.println("转换后电压:" + voltage + "V");
}
}
执行结果:
原电压:220V
转换后电压:55V
当不需要实现接口提供的全部方法时,可以先设计一个抽象类实现这个接口,并为接口的每个方法提供一个默认实现(空方法),然后这个抽象类的子类就可以有选择性的覆盖父类的某些方法,以此来实现某些需求。
1、InterfaceZ:要实现的接口
2、AbsAdapter:实现接口的抽象类,并为每个方法提供一个默认实现
3、ConcreteClass:抽象类的实现类,有选择性的覆盖有些方法
public interface InterfaceZ {
void ope01();
void ope02();
void ope03();
void ope04();
}
// 对接口中的方法提供一个默认实现
public abstract class AbsAdapter implements InterfaceZ {
@Override
public void ope01() {
}
@Override
public void ope02() {
}
@Override
public void ope03() {
}
@Override
public void ope04() {
}
}
// 只覆盖方法 ope01
public class A extends AbsAdapter {
@Override
public void ope01() {
System.out.println("使用了 ‘ope01’ 方法");
}
}
public class Client {
public static void main(String[] args) {
A a = new A();
a.ope01();
}
}
执行结果:
使用了 ‘ope01’ 方法
使用场景
适用于一个不想实现接口中全部方法的情况。