1、适配器模式应用场景
适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期望的另一个接口,使原本接口不兼容的类可以一起工作,属于结构型设计模式。适配器模式适用于以下集中业务场景:
- 已经存在的类的方法和需求不匹配(方法结果相同或者相似)的情况。
- 适配器模式不是软件设计初始阶段考虑的设计模式,是随着软件的发展,由于不同的产品、不同厂家造成功能类似而接口不同的问题的解决方案。
2、适配器模式详解
2.1、适配器模式角色构成
一般来说,适配器模式有以下三种角色:
- 目标接口(Target):定义用户使用特定领域相关的接口。
- 被适配者(adaptee):定义了一个已经存在的接口,这个接口将被适配。
- 适配者(adapter):适配器,对target 和 adaptee 接口进行适配。
2.2、适配器模式分类
- 类的适配器模式(采用继承实现)
- 对象适配器(采用对象组合的方式实现)
我们先来看下这两种实现模式的优缺点: - 类适配器采用继承的实现方式,带来了不良的高耦合
- 对象适配器采用对象“组合”的方式,更符合松耦合的设计原则
- 对Java语言来说,类适配器无法面对多个被适配对象,因为语言不支持多继承
3、适配器模式的实现步骤及案例
我们日常生活中常见的一个场景,我国民用电都是220V的交流电,但是我们手机充电使用的一般都是5V的直流电,所有我们给手机充电的是就需要专门的充电器(也就是电源适配器)。下面看一下代码还原这个场景。
3.1、确定适配目标接口
我们这里的目标接口就是我们需要的DC5V直流接口
package com.example.demo.adapter;
public interface DC5V {
int outPut();
}
3.2、确定被适配者
这里的被适配者就是我们的民用交流电AC220
package com.example.demo.adapter;
public class AC220 {
public int outPutAc220() {
int output = 220;
System.out.println("输出交流点:" + output);
return output;
}
}
3.3、创建适配器
这里我们分别用之前提到两种实现方式分别创建适配器。
类适配器
package com.example.demo.adapter;
public class ClassPowerAdapter extends AC220 implements DC5V {
@Override
public int outPut() {
int input = new AC220().outPutAc220();
int adapterOutput = input / 44;
System.out.println("使用ClassPowerAdapter输入AC:" + input + "V" + "输出DC:" + adapterOutput + "V");
return adapterOutput;
}
}
测试
public static void main(String[] args) {
ClassPowerAdapter classPowerAdapter = new ClassPowerAdapter();
classPowerAdapter.outPut();
}
结果如下:
对象适配器
package com.example.demo.adapter;
public class ObjectPowerAdapter implements DC5V {
private AC220 ac220;
public ObjectPowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int outPut() {
int input = ac220.outPutAc220();
int adapterOutput = input / 44;
System.out.println("使用ClassPowerAdapter输入AC:" + input + "V " + "输出DC:" + adapterOutput + "V");
return adapterOutput;
}
}
测试
public static void main(String[] args) {
DC5V dc5V = new ObjectPowerAdapter(new AC220());
dc5V.outPut();
}
结果如下: