适配器模式解决了下面的问题:比如我有220v的电源,可是我的手机需要的却是5v的电压,这种情况只能通过适配器的转化就能够将其转化。
直接上代码说明问题:
1.类适配器:(通过继承关系实现)
手机对象
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 adapter.classadapter;
//被适配的类
public class Voltage220V {
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏特");
return src;
}
}
目标方法:手机孔的电压
package adapter.classadapter;
public interface IVoltage5V {
public int output5V();
}
适配器:将220v ---->5v
package adapter.classadapter;
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
int srcV = output220V();
int dstV = srcV / 44 ;
return dstV;
}
}
使用的测试代码:
package adapter.classadapter;
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());
}
}
运行效果如下:
我们发现虽然上面的代码实现了转换,但是继承的代价太大了,毕竟java是单继承,于是我们可以用下面的对象适配器进行优化
对象适配器 (通过聚合来实现)
其实代码跟上面的区别主要在于适配器类的书写,其他类的代码还是参照上面的吧
package adapter.objectadapter;
//适配器类
public class VoltageAdapter implements IVoltage5V {
Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int dstV = 0 ;
if (null != voltage220V){
int srcV = voltage220V.output220V();
dstV = srcV / 44 ;
}
return dstV;
}
}
因为适配器改了,所以测试时,也需要做个小的改变:
package 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 IIIII;
public interface ILuzelong {
void charging1();
void charging2();
void charging3();
void charging4();
}
抽象类进行空实现
package IIIII;
public abstract class AbsAdapter implements ILuzelong{
@Override
public void charging1() {
}
@Override
public void charging2() {
}
@Override
public void charging3() {
}
@Override
public void charging4() {
}
}
使用时在选择性的重写抽象类的方法:
package IIIII;
public class Test {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
@Override
public void charging1() {
System.out.println("给你5v");
}
};
absAdapter.charging1();
}
}
运行的结果如下: