1. 适配器模式概述
适配器模式可以作为两个不兼容的接口之间的桥梁。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
适配器模式可以让一个对象调用接口时,执行的是原本不兼容的另一个接口的功能。
(1) 适用情况
系统需要使用现有的类的功能,但是此类的接口不符合系统的需要。
(2) 优点
对本无法被调用的代码进行复用,通过实现新接口,使其适配新的需要。
(3) 缺点
如果使用类适配器,由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类或接口。
适配器修改了原本类的功能,容易使得理解困难。
2. 适配器模式实例
现在我们有一个手机,它只能使用5V的电压进行充电,但是国内的居民用电电压都是220V,为了给手机充电,需要对电压进行适配。
(1) 类适配器
1) 声明电源电压输出接口和手机充电电压输出接口
public interface PowerVoltageOutput {
/**
* 电源输出电压
*/
int output();
}
public interface PhoneVoltageOutput {
/**
* 手机充电所需5V电压
*/
int output5();
}
2) 实现电源类,实现电压输出接口
public class PowerVoltage implements PowerVoltageOutput {
@Override
public int output() {
// 输出220V电压
return 220;
}
}
3) 实现电压适配器,将220V电压转换为5V电压
public class VoltageAdapter extends PowerVoltage implements PhoneVoltageOutput {
/**
* 输出5V电压
*/
@Override
public int output5() {
System.out.println("使用适配器进行电压适配...");
int input = super.output();
int output = input / 44;
System.out.println("输入电压:" + input + "V" + ",适配为:" + output + "V");
return output;
}
}
这里使用的是继承的方式,只能继承一个电源类。
4) 使用适配器进行电压转换
public static void main(String[] args) {
PowerVoltage powerVoltage = new PowerVoltage();
System.out.println("当前电压为:" + powerVoltage.output() + "V");
VoltageAdapter adapter = new VoltageAdapter();
System.out.println("当前电压为:" + adapter.output5() + "V");
}
(2) 对象适配器
在实现电压适配器时,可以使用组合来替代继承的方式,减少其耦合。
public class VoltageAdapter extends PowerVoltage implements PhoneVoltageOutput {
PowerVoltage powerVoltage = new PowerVoltage();
/**
* 输出5V电压
*/
@Override
public int output5() {
System.out.println("\n使用适配器进行电压适配...");
int input = powerVoltage.output();
int output = input / 44;
System.out.println("输入电压:" + input + "V" + ",适配为:" + output + "V");
return output;
}
}
运行结果:
3. 一些思考
适配器模式、装饰器模式以及代理模式有相似之处,但是这几个模式设计的目的是不同的:
适配器模式的意义是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的;
适配器是自己新建接口并实现,在实现中包含被适配的接口,从而改变所考虑对象的接口;
适配器模式包装的是不同类型的对象,然后将其伪装成自己的同类。
装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能;
装饰器模式包装的是自己的同类,相同的接口或者父类;
装饰器模式从来不创建被装饰的对象,它总是添加新功能到已经存在的对象上面;
装饰器模式可以通过嵌套装饰添加多重额外功能。
代理模式中,我们创建具有现有对象能力的对象,以控制对这个对象的访问,向外界提供功能接口;
代理模式与源对象实现同一接口,不能改变所代理对象的接口,只能控制对其的操作;
代理模式一般不推荐使用嵌套代理。
参考引用
适配器模式:www.runoob.com/design-patt…
适配器模式及典型应用:blog.csdn.net/wwwdc1012/a…
适配器模式,装饰模式,代理模式区别与对比:www.jianshu.com/p/414d0acff…