设计模式——适配器模式
适配器模式
是否有考虑过为什么我们手机充电器插头不是图2中的样子,而是图1中的样子。
其实手机电池要求输入电压为5V,但是我们家用电压均为220V,为了完成给手机充电这个操作,我们就需要将输入电压从22V转换为5V,其中完成这个转换操作的东西就是适配器。这就是手机充电插头是图1样子的原因。
现在我们通过使用代码实现给手机充电这一流程,体会一下Java中的适配器模式。
类图如下:
具体代码:
//Phone
public class Phone {
//手机充电
public void charging(IVoltage5V iVoltage5V) {
if(iVoltage5V.output5V() == 5) {
System.out.println("电压为5V,可以正常充电。。。");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("电压过高,不能充电。。。");
}
}
}
//电池要求电压
public interface IVoltage5V {
//充电器输入输出电压5V
public int output5V();
}
//家用220V电压
public class Voltage220V {
public int output220V() {
int src = 220;
System.out.println("家用电压= " + src + " V");
return src;
}
}
//适配器,手机充电器插头
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
//将家用220V电压转换为5V电压
@Override
public int output5V() {
int srcV = output220V();
int dstV = srcV / 44 ;
return dstV;
}
}
//main
public static void main(String[] args) {
System.out.println(" === 适配器模式 ====");
Phone phone = new Phone();
phone.charging(new VoltageAdapter()); //里式替换原则
}
我们通过创建一个Adapter类来实现了家用电压220V到5V的转换。
适配器模式简单介绍
适配器模式定义:将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式中通用类图如下:
在类图中:
- Target目标角色:需要将其他类转换为何种接口,也就是我们最终需要的结果。
- Adaptee源角色:被转换的类。
- Adapter适配器角色:实现Adaptee到Target的转换操作。
在上述手机充电案例中,我们需要将220V电压转换为5V电压,其中Target就是Voltager5V,Adaptee就是Voltage220V。
类适配器模式
在上述手机充电案例中,我们用的就是类适配器模式实现的。
由于Java是单继承的,在这个案例中,Adapter类继承了Adaptee类,并且要求Adapter类实现Target接口。
对象适配器模式
除了让Adapter类继承Adaptee类+实现Target接口外。我们还可以根据合成复用原则,将Adaptee类聚合到Apdater类中,这样Target就既可以是接口,也可是类了。
修改后的Adapter类如下:
//适配器类
public class VoltageAdapter implements IVoltage5V {
private Voltage220V voltage220V; // 关联关系-聚合
//通过构造器,传入一个 Voltage220V 实例
public VoltageAdapter(Voltage220V voltage220v) {
this.voltage220V = voltage220v;
}
@Override
public int output5V() {
int dst = 0;
if(null != voltage220V) {
int src = voltage220V.output220V();//获取220V 电压
System.out.println("使用对象适配器,进行适配~~");
dst = src / 44;
System.out.println("适配完成,输出的电压为=" + dst);
}
return dst;
}
}
类适配器模式和对象适配器模式主要区别就是Adapter类和Adaptee类的依赖方式不同。
接口适配器模式
有的时候我们并不需要实现Target中所有的方法,这时我们就可以设计一个抽象类来实现Target接口,并为接口中每一个方法提供一个空实现作为方法的默认实现。这样我们的Adapter类在继承该抽象类的时候就可以选择性的实现方法了。
总结
适配器模式优点:
- 提高了类的复用:一个类可以在两个系统中正常执行。
- 灵活性高:Adapter类的增加和减少不会影响到其他代码。
适配器模式使用场景:
- 项目已经投产,但又增加了新的需求,比如两个系统关联,当前系统要使用另外一个系统的类,但是该类接口又不符合当前系统要求,此时就需要使用适配器模式。
- 适配器模式是为了解决项目已经完工又产生新需求的,在设计阶段和开发阶段是不需要考虑的。
在适配器模式中,主要使用的设计原则是依赖倒转原则和里式替换原则。
本文地址:https://blog.csdn.net/qq_36917119/article/details/107891966
上一篇: 如何使用脚本模仿登陆过程
下一篇: 深入浅出KNN算法(二) 实践篇