1)适配器模式是将某个类的接口转换成客户期望的另外一个接口表示,其主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装类。
2)适配器模式属于结构型模式。
3)主要分为三类: 类适配器模式、 对象适配器模式、 接口适配器模式
1)适配器模式: 将一个类的接口转换成另一个接口,让原本接口不兼容的类可以兼容。
2) 从用户的角度看不到适配者,是解耦的。
3) 用户调用适配器转换出来的的目标接口方法,适配器再调用被适配者的相关接口方法。
4) 用户收到接口的反馈,感觉只是和目标接口交互:
Adapter类,通过继承src类,实现dst类接口,实现src->dst的适配。
uml图如下:
代码实现:
被适配器适配的类:
// 被适配的类
public class Voltage220V {
//输出220V电压
public int output220V() {
int src = 220;
System.out.println("电压:" + src + "V");
return src;
}
}
目标接口类:
// 适配接口,用户需要的接口,可以是一个抽象类或者是接口
public interface IVoltage5V {
public int output5V();
}
适配器类继承被适配器类并实现目标接口:
// 适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
// //可以改为对象适配器,持有被适配者的对象
// private Voltage220V voltage220V;
@Override
public int output5V() {
// TODO Auto-generated method stub
//获取到220V电压
int srcV = output220V();
int dstV = srcV / 44 ; //转成 5v
return dstV;
}
}
测试类:
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(" === 类适配器模式 ====");
Phone phone = new Phone();
//充电
phone.charging(new VoltageAdapter());
}
}
客户使用电话,看不到被适配器的类,只能通过适配器来实现目标接口的行为。
public class Phone {
// 充电
public void charging(IVoltage5V iVoltage5V) {
if(iVoltage5V.output5V() == 5) {
System.out.println("电压为5V, 可以充电~~");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("电压大于5V, 不能充电~~");
}
}
}
与上述介绍的类适配器模式不同的地方有,不再通过继承被适配者类来获取方法,对象适配器是通过对象来获取到方法,这是二者的区别。对象适配器通过构造器来初始化被适配者对象。
被适配者类代码:
package com.atguigu.adapter.objectadapter;
//对象适配器
public class VoltageAdapter implements IVoltage5V {
private 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("ʹ220V电压");
dst = src / 44;
System.out.println("适配后的电压:" + dst);
}
return dst;
}
}
客户端代码,在使用适配器的时候,传入被适配者实例,即可完成手机充电的逻辑:
package com.atguigu.adapter.objectadapter;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("对象适配器");
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
通过抽象类实现目标接口,然后用匿名内部类来对想要的接口方法进行改造,即可完成接口适配。代码如下:
目标接口:
package com.atguigu.adapter.interfaceadapter;
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
抽象类:
package com.atguigu.adapter.interfaceadapter;
//抽象类
public abstract class AbsAdapter implements Interface4 {
//实现4接口
public void m1() {
}
public void m2() {
}
public void m3() {
}
public void m4() {
}
}
客户端:
package com.atguigu.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
//ֻ只需要覆盖我们使用的接口方法
@Override
public void m1() {
// TODO Auto-generated method stub
System.out.println("覆盖后的m1方法");
}
};
absAdapter.m1();
}
}
参考博客: https://blog.csdn.net/wwwdc1012/article/details/82780560