本文介绍23种设计模式中结构型模式的适配器模式
目录
1. 适配器模式
1.1 基本介绍
1) 适配器模式(Adapter Patern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装(Wrapper)
2) 适配器模式属于结构型模式
3) 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
1.2 工作原理
1) 适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容,其别名为包装器
2) 从用户的角度看不到被适配者,是解耦的
3) 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法
4)用户收到反馈结果,感觉只是和目标接口交互,如图
1.3 适配器模式的注意事项和细节
1) 三种命名方式,是根据 src是以怎样的形式给到Adapter(在Adapter里的形式)来命名的。
2) 类适配器:以类给到,在Adapter里,就是将src当做类,继承
对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有
接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
3) Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。
4) 实际开发中,实现起来不拘泥于我们讲解的三种经典形式
1.4 类适配器模式
1.4.1 类适配器模式介绍
基本介绍 : Adapter类,通过继承 src类,实现 dst类接口,完成src->dst的适配
1.4.2 应用实例
1) 应用实例说明以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的目dst(即 目标)是5V直流电
2)思路分析图解
3) 代码实现
IVoltage5v 代码
public interface IVoltage5v {
public int output5V();
}
Voltage220V 代码
public class Voltage220V {
//输出220V
public int output220V() {
int src = 220;
System.out.println("电压:" + src + "伏");
return src;
}
}
VoltageAdapter 代码
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5v{
@Override
public int output5V() {
// 获取220V电压
int src = output220V();
int dst = src / 44;
System.out.println("适配器将" + src + "V的电压转换为" + dst + "V");
return dst;
}
}
Client 代码
public class Client {
public static void main(String[] args) {
System.out.println("类适配器模式");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
Phone 代码
public class Phone {
//手机充电
public void charging(IVoltage5v iVoltage5v){
if (iVoltage5v.output5V()==5){
System.out.println("手机充电");
}else if (iVoltage5v.output5V()>5){
System.out.println("电压大于5v,电压不匹配");
}
}
}
运行结果
1.4.3 注意事项和细节
1)Java是单继承机制,所以类适配器需要继承src类这点算是一个缺点,因为这要求dst必须是接口,有一定局限性;
2)src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
3)由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。
1.5 对象适配器模式
1.5.1 基本介绍
1)基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。即:持有src类,实现 dst 类接口,完成src->dst的适配
2)根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系
3)对象适配器模式是适配器模式常用的一种
1.5.2 应用实例
1) 以生活中充电器的例子来讲解适配器,充电器本身相当Adapter,220V交流电相当于src(即被适配者),我们的目dst(即目标)是5V直流电,使用对象适配器模式完成。
2)类图
代码实现
IVoltage5v接口
public interface IVoltage5v {
public int output5V() ;
}
Voltage220V类
public class Voltage220V {
//输出220V电压
public int output220V(){
//模拟
int src = 220;
System.out.println("电压:" + src + "伏");
return src;
}
}
VoltageAdapter类
public class VoltageAdapter implements IVoltage5v{
private final Voltage220V Voltage220V;//适配器需要一个5V电压
//通过构造器,传入一个Voltage220V的实例
public VoltageAdapter(Voltage220V voltage220V){
this.Voltage220V=voltage220V;
}
@Override
public int output5V() {
int dst = 0;
if (Voltage220V !=null){
int src = Voltage220V.output220V();//获取220V电压
System.out.println("使用对象适配器,进行适配");
dst = src/44;
System.out.println("适配完成,输出电压为:"+dst);
}
return dst;
}
}
Phone类
public class Phone {
public void charging(IVoltage5v iVoltage5v)
{
if(iVoltage5v.output5V() == 5)
{
System.out.println("电压为5V,可以充电");
}
else
{
System.out.println("电压不匹配,不能充电");
}
}
}
Client类
public class Client {
public static void main(String[] args) {
System.out.println("使用对象适配器");
Phone phone =new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
运行结果
1.5.3 注意事项和细节
1) 对象适配器和类适配器算是同一种思想,只不过实现方式不同.根据合成复用原则,使用组合替代继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口
1) 使用成本低,更灵活
作者 : 2401_85014515
博客 : 2401_85014515的博客_CSDN,JAVA知识,JAVA开发技术详解 (转载请声明出处)
标签:src,JAVA,dst,适配器,接口,模式,设计模式,public From: https://blog.csdn.net/2401_85014515/article/details/140316816