一、基本介绍
- 适配器模式(Adapter Pattern)的作用是将某个类的接口转换成客户端期望的另一个接口表示。
- 适配器模式属于结构型模式
- 适配器主要分为三种类型:类适配器、对象适配器和接口适配器
二、类适配器模式
2.1 类适配器角色
适配器类(Adapter),通过继承要转换类(src),实现要转换的目标类(dst),完成src->dst的转换
2.2 类适配器图
2.3 类适配器举例
步骤一:创建目标接口
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 将要适配的接口(5V电压)
**/
public interface IVoltage5V {
public int outPut5V();
}
步骤二:创建被适配的类
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 被适配的类(220V电压)
**/
public class Voltage220V {
public int outPut220V(){
int src = 220;
System.out.println("适配器输入电压(单位:V):"+src);
return src;
}
}
步骤三:创建类适配器
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 类适配器:电压适配器,将220V电压适配5V电压
**/
public class ClassVoltageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int outPut5V() {
//转换处理
int src = this.outPut220V();
int dst = src/44;
System.out.println("适配器输出电压(单位:V):"+dst);
return dst;
}
}
步骤四:适配器的使用
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 类适配器模式使用
**/
public class Phone {
/**
* 手机只能接收5V充电
* @param iVoltage5V
*/
public void charging(IVoltage5V iVoltage5V){
if (iVoltage5V.outPut5V() == 5){
System.out.println("手机开始充电");
}else if (iVoltage5V.outPut5V() > 5){
System.out.println("手机充电电压过高,无法充电");
}
}
public static void main(String[] args) {
Phone phone = new Phone();
ClassVoltageAdapter classVoltageAdapter = new ClassVoltageAdapter();
phone.charging(classVoltageAdapter);
}
}
三、对象类型适配器
3.1 基本思路
适配器类持有被转换的类,实现目标类接口
3.2 对象适配器类图
3.3 对象适配器类举例
步骤一:被适配的类
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 被适配的类(220V电压)
**/
public class Voltage220V {
public int outPut220V(){
int src = 220;
System.out.println("适配器输入电压(单位:V):"+src);
return src;
}
}
步骤二:目标接口
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 将要适配的接口(5V电压)
**/
public interface IVoltage5V {
public int outPut5V();
}
步骤三:适配器
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 对象类型适配器:电压适配器,将220V电压适配5V电压
**/
public class ObjectVoltageAdapter implements IVoltage5V {
//通过关联关系引入220V电源
private Voltage220V voltage220V;
public ObjectVoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int outPut5V() {
//转换处理
int src = voltage220V.outPut220V();
int dst = src/44;
System.out.println("适配器输出电压(单位:V):"+dst);
return dst;
}
}
步骤四:对象类适配器的使用
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 类适配器模式使用
**/
public class Phone {
/**
* 手机只能接收5V充电
* @param iVoltage5V
*/
public void charging(IVoltage5V iVoltage5V){
if (iVoltage5V.outPut5V() == 5){
System.out.println("手机开始充电");
}else if (iVoltage5V.outPut5V() > 5){
System.out.println("手机充电电压过高,无法充电");
}
}
public static void main(String[] args) {
Phone phone = new Phone();
Voltage220V voltage220V = new Voltage220V();
ObjectVoltageAdapter voltageAdapter = new ObjectVoltageAdapter(voltage220V);
phone.charging(voltageAdapter);
}
}
三、接口适配器
3.1 接口适配器基本介绍
当不需要全部实现接口提供的方法时,先设计一个抽象类实现接口,并为该接口的每个方法提供一个默认实现,该抽象类的子类可以有选择地覆盖父类的某些方法实现需求。
3.2 接口适配器类图
3.3 接口适配器举例
步骤一:创建目标接口
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 目标接口
**/
public interface IVoltage {
public int voltage110To5V();
public int voltage220To5V();
}
步骤二:创建接口配器抽象类
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 接口适配器抽象类
**/
public abstract class AbstractAdapter implements IVoltage {
@Override
public int voltage110To5V() {
return 0;
}
@Override
public int voltage220To5V() {
return 0;
}
}
步骤三:具体的接口适配器
/**
* @Author: wzq
* @Date: 2022/7/25
* @Desc: 具体的适配器类
**/
public class Voltage110To5VAdapter extends AbstractAdapter{
public int voltage110To5V() {
int v110 = 110;
System.out.println("接口适配器电压由"+v110+"V转换为5V");
int dis = v110/44;
return dis;
}
}
/**
* @Author: wzq
* @Date: 2022/7/25
* @Desc: 具体的适配器类
**/
public class Voltage220To5VAdapter extends AbstractAdapter{
@Override
public int voltage220To5V() {
int v220 = 220;
System.out.println("接口适配器电压由"+v220+"V转换为5V");
int dis = v220/44;
return dis;
}
}
步骤四:接口适配器的使用
/**
* @Author: wzq
* @Date: 2022/7/24
* @Desc: 接口适配器模式使用
**/
public class Phone {
public void charging(int disVoltage){
if (disVoltage == 5){
System.out.println("手机开始充电");
}else if (disVoltage > 5){
System.out.println("手机充电电压过高,无法充电");
}
}
public static void main(String[] args) {
// AbstractAdapter abstract220VAdapter = new AbstractAdapter(){
// @Override
// public int voltage220To5V() {
// int v220 = 220;
// System.out.println("接口适配器电压由"+v220+"V转换为5V");
// int dis = v220/44;
// return dis;
// }
// };
//
// AbstractAdapter abstract110VAdapter = new AbstractAdapter(){
// @Override
// public int voltage110To5V() {
// int v110 = 110;
// System.out.println("接口适配器电压由"+v110+"V转换为5V");
// int dis = v110/44;
// return dis;
// }
// };
Phone phone = new Phone();
int v5v = 0;
v5v = new Voltage110To5VAdapter().voltage110To5V();
v5v = new Voltage220To5VAdapter().voltage110To5V();
phone.charging(v5v);
}
}
四、三种适配器对比
- 类适配器:类适配器是继承要转换的类
- 对象适配器:对象适配器是持有要转换的类
- 接口适配器:接口适配器是实现要转换的类