适配器模式
介绍
- 适配器模 式 (Adapter 将 某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器。(就像手机要充电,不同的手机需要不同的电压,所以充电器就会转换手机所要充电的电压)
- 适配器模式属于结构型模式
- 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
工作原理
- 适配器模式:将一个类的接口转换成另一种接口 让 原本接口不兼容的类可以兼容从用户的角度看不到被适配者 ,是解耦的。
- 用户调用适配器转化出来的目标接口方法适配器再调用被适配者的相关接口方法
- 用户收到反馈结果,感觉只是和目标接口交互。
类适配器模式
- 基本介绍: Adapter 类,通过继承 src 类,实现 dst 类接口,完成 src -->dst 的适配。
- 应用举例:充电器本身相当于 Adapter 220V 交流电相当于 src ( 即被适配者),我们的目的 dst( 即目标) 是 5V 直流电。
- 如图展示:
- 代码演示:
//资源220V
public class Voltager220V {
//输出电压220v
public int output220v() {
int src = 220;
System.out.println("电压为220v");
return src;
}
}
//接口5V
public interface IVoltager5V {
public int output();
}
//适配器
public class Adapter extends Voltager220V implements IVoltager5V{
@Override
public int output() {
//获取资源的电源
int src = output220v();
//进行转换
src = src/44;
System.out.println("电压为5V");
return src;
}
}
//电话
public class Phone {
//充电
public void charging(IVoltager5V iVoltager5V) {
if(iVoltager5V.output()==5) {
System.out.println("手机正在充电!!");
}else if(iVoltager5V.output()>5){
System.out.println("电压过高!!");
}
}
}
public class Client {
public static void main(String[] args) {
//创建一个适配器
Adapter adapter = new Adapter();
Phone phone = new Phone();
phone.charging(adapter);
}
}
- 结果:
- 注意细节:
- Java 是单继承机制 ,所以类适配器需要继承 src 类这一点算是一个缺点,因为这要求 dst 必须是接口,有一定局限性
- src 类的方法在 Adapter 中都会暴露出来,也增加了使用的成本 。
- 由 于其继承了 src 类,所以它可以根据需求重写 src 类的方法,使得 Adapter 的灵活性增强了 。
对象适配器模式
-
基本介绍:
- 基本思路和类的适配器模式相同,只是将 Adapter 类作修改 ,不 是 继 承 src 类,而是持有 src 类的实例,以解决兼容性的问题。 即 :持有 src 类,实现 dst 类接口,完成 src -->dst 的适配
- 根 据“合成复用原则”,在系统中尽量使用关联关系来替代继承关 系。
- 对象适配器模式是适配器模式常用的一种
-
应用举例:
-
代码演示:
//资源220V
public class Voltager220V {
//输出电压220v
public int output220v() {
int src = 220;
System.out.println("电压为220v");
return src;
}
}
//接口5V
public interface IVoltager5V {
public int output();
}
//适配器
public class Adapter implements IVoltager5V{
private Voltager220V voltager220V;
//通过构造器获取资源
public Adapter(Voltager220V voltager220V) {
this.voltager220V = voltager220V;
}
@Override
public int output() {
//获取资源的电源
int src = voltager220V.output220v();
//进行转换
if(null!=voltager220V) {
src = src/44;
System.out.println("电压为5V");
return src;
}else {
System.out.println("没有电源");
return 0;
}
}
}
//电话
public class Phone {
//充电
public void charging(IVoltager5V iVoltager5V) {
if(iVoltager5V.output()==5) {
System.out.println("手机正在充电!!");
}else if(iVoltager5V.output()>5){
System.out.println("电压过高!!");
}
}
}
public class Client {
public static void main(String[] args) {
//创建一个适配器
Adapter adapter = new Adapter(new Voltager220V());
Phone phone = new Phone();
phone.charging(adapter);
}
}
- 注意细节:
- 对 象适配器和类适配器其实算是同一种思想,只不过实现方式不同。根据合成复用原则 使用 组合替代继 承, 所 以它解决了类适配器必须继承 src 的局限性问题,也不再要求 dst 必须是接口 。
- 使用成本更低,更灵活 。
适配器模式总结
- 三种命名方式,是根据 src 是以怎样的形式给到 Adapter (在 Adapter 里的形式)来命名的。
- 类 适配器:以类给到,在Adapter里,就是将src当做类,继承
- 对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有
- 接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
- Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作。