引言
适配器模式,又名Adapter模式.在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况.这种用于填补"现有的程序"和"所需的程序"之间差异的设计模式就是
Adapter模式.
举例
比如我们的电源输出的是220v电压,相当于"现有的程序",而我们电脑充电只需要10v的电压,手机充电只需要5v的电压,电脑或手机需要的电压相当于"所需的程序",而我们手机充电头就充当了适配器的角色,这两者之间的差异就由它解决.下面就由这个例子讲述Adapter模式的两种写法.
一丶 使用继承
原始电源的抽象:
//原始电源 只能输出220v电压
public class Power220V {
protected int output220V(){
System.out.println("正在输出电压:220v");
return 220;
}
}
10v电源适配器的抽象:
//继承自原始电源
public class Power10VAdapter extends Power220V{
public int output10V(){
int v = output220V(); //先使用原始电源输出
if (v!=10){ //发现电压不合适
System.out.println("正在适配10v电压..."); //开始适配
v = 10; //适配过程
System.out.println("适配电压成功"); //适配完毕
System.out.println("正在输出电压:"+v+"v");
}
return v;
}
}
5v电源适配器的抽象:
public class Power5VAdapter extends Power220V{
public int output5V(){
int v = output220V();
if (v!=5){
System.out.println("正在适配5v电压...");
v = 5;
System.out.println("适配电压成功");
System.out.println("正在输出电压:"+v+"v");
}
return v;
}
}
测试代码(客户端代码):
public static void main(String[] args) {
//给电脑充电
Power10VAdapter power10VAdapter = new Power10VAdapter();
power10VAdapter.output10V();
System.out.println("------------------------------"); //分割线
//给手机充电
Power5VAdapter power5VAdapter = new Power5VAdapter();
power5VAdapter.output5V();
}
输出结果:
正在输出电压:220v
正在适配10v电压...
适配电压成功
正在输出电压:10v
------------------------------
正在输出电压:220v
正在适配5v电压...
适配电压成功
正在输出电压:5v
二丶使用委托
我们可以看到,在使用的继承时候,我们无非是想使用父类的某个方法,因此,可以使用委托取缔继承实现。还是上面的例子。
原始电源的抽象:
//原始电源 只能输出220v电压
public class Power220V {
protected int output220V(){
System.out.println("正在输出电压:220v");
return 220;
}
}
10v电源的抽象:
public class Power10VAdapter {
private Power220V power220V;
public Power10VAdapter(Power220V power220V) {
this.power220V = power220V;
}
public int output10V(){
int v = power220V.output220V();
if (v!=10){
System.out.println("正在适配10v电压...");
v = 10;
System.out.println("适配电压成功");
System.out.println("正在输出电压:"+v+"v");
}
return v;
}
}
5v电源的抽象:
public class Power5VAdapter {
private Power220V power220V;
public Power5VAdapter(Power220V power220V) {
this.power220V = power220V;
}
public int output5V(){
int v = power220V.output220V();
if (v!=5){
System.out.println("正在适配5v电压...");
v = 5;
System.out.println("适配电压成功");
System.out.println("正在输出电压:"+v+"v");
}
return v;
}
}
测试代码(客户端代码):
public static void main(String[] args) {
//给电脑充电
Power10VAdapter power10VAdapter = new Power10VAdapter(new Power220V());
power10VAdapter.output10V();
System.out.println("------------------------------"); //分割线
//给手机充电
Power5VAdapter power5VAdapter = new Power5VAdapter(new Power220V());
power5VAdapter.output5V();
}
输出结果:
正在输出电压:220v
正在适配10v电压...
适配电压成功
正在输出电压:10v
------------------------------
正在输出电压:220v
正在适配5v电压...
适配电压成功
正在输出电压:5v
可以看到,输入结果是一模一样的.
总结
- 使用继承和委托的方式都能实现Adpter模式
- 使用委托的时候需要持有拥有需要方法的原始类的引用