泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器)
,这样就可以使用了
兼容性
,让原本因接口不匹配不能一起工作的两个类可以协同工作
。其别名为包装器(Wrapper)1、适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容
2、从用户的角度看不到被适配者,是解耦的
3、用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法
4、收到反馈结果,感觉只是和目标接口交互,如图
基本介绍: Adapter 类,通过继承 src 类,实现 dst 类接口,完成 src->dst 的适配
以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter,220V 交流电相当于 src (即被适配者),我们的目 dst(即 目标)是 5V 直流电
适配接口:↓
//适配接口
public interface IVoltage5V { public int output5V();
}
手机类:↓
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, 不能充电~~");}}
}
被适配的类:↓
//被适配的类
public class Voltage220V {//输出 220V 的电压public int output220V() { int src = 220;System.out.println("电压=" + src + "伏");return src;}
}
适配器类:↓
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {@Overridepublic int output5V() {//获取到 220V 电压int srcV = output220V();int dstV = srcV / 44 ; //转成 5v return dstV;}
}
主函数:↓
//主函数
public class Client {public static void main(String[] args) {System.out.println(" === 类适配器模式 ===="); Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}
1)Java 是单继承机制,所以类适配器需要继承 src 类这一点算是一个缺点, 因为这要求 dst 必须是接口,有一定局限性;
2)src 类的方法在 Adapter 中都会暴露出来,也增加了使用的成本。
3)由于其继承了 src 类,所以它可以根据需求重写 src 类的方法,使得 Adapter 的灵活性增强了。
对象适配器模式是适配器模式常用的一种
以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter,220V 交流电相当于 src (即被适配者),我们的目 dst(即目标)是 5V 直流电,使用对象适配器模式完成。
主函数:↓
public class Client {public static void main(String[] args) {System.out.println(" === 对象适配器模式 ===="); Phone phone = new Phone();phone.charging(new VoltageAdapter(new Voltage220V()));}
}
适配接口类:↓
//适配接口
public interface IVoltage5V { public int output5V();
}
手机类:↓
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, 不能充电~~");}}
}
被适配的类:↓
//被适配的类
public class Voltage220V {//输出 220V 的电压,不变public int output220V() { int src = 220;System.out.println("电压=" + src + "伏");return src;}
}
适配器类:↓
//适配器类
public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V; // 聚合关系//通过构造器,传入一个 Voltage220V 实例public VoltageAdapter(Voltage220V voltage220v) {this.voltage220V = voltage220v;}@Overridepublic int output5V() {int dst = 0;if(null != voltage220V) {int src = voltage220V.output220V();//获取 220V 电压dst = src / 44;//转换为5V}return dst;}
}
根据合成复用原则,使用组合替代继承
, 所以它解决了类适配器必须继承 src 的局限性问题,也不再要求 dst
必须是接口。
public interface Interface4 { public void m1();public void m2(); public void m3();public void m4();
}
//在 AbsAdapter 我们将 Interface4 的方法进行默认实现
public abstract class AbsAdapter implements Interface4 {//默认实现,空实现public void m1() {}public void m2() {}public void m3() {}public void m4() {}}
public class Client {public static void main(String[] args) {//通过new一个匿名内部类,并实现重写自己需要的方法AbsAdapter absAdapter = new AbsAdapter() {//只需要去覆盖我们 需要使用 接口方法@Overridepublic void m1() {System.out.println("使用了 m1 的方法");}};absAdapter.m1();}
}
继承
持有(组合、聚合)
实现
作用
是: 将原本不兼容的接口融合在一起工作
。