面向对象的23种设计模式点这里。说到适配器,我想我们接触最多的叫电源适配器。没错,所有的手机充电器都是电源适配器。从交流变直流,从220v到5v。而适配器模式分为两种,一种是类适配器,一种是对象适配器。下面先写类适配器:
public class Adapter {
static class HomePower {
public String homeRequest() {
return "220V交流电";
}
}
// 目标接口,或称为标准接口
interface PhonePower {
public String request();
}
// 具体目标类,只提供普通功能
static class AndroidPower implements PhonePower {
public String request() {
return "5v直流电";
}
}
//充电使用标准接口
static class Android {
public void charge(PhonePower power) {
System.out.println(power.request() + "充电");
}
}
// 适配器类,继承了被适配类,同时实现标准接口
static class PowerAdapter extends HomePower implements PhonePower {
public String request() {
return super.homeRequest();
}
}
// 测试类public class Client {
public static void main(String[] args) {
new Android().charge(new AndroidPower());
//有了电源适配器安卓就可以使用220v充电
new Android().charge(new PowerAdapter());
}
}
输出:
5v直流电充电
220V交流电充电
下面是对象适配器模式:
public class Adapter {
static class HomePower {
public String homeRequest() {
return "220V交流电";
}
}
// 只有具体目标类,目标接口是因为java不支持多继承
static class AndroidPower {
public String request() {
return "5v直流电";
}
}
//充电使用标Android接口
static class Android {
public void charge(AndroidPower power) {
System.out.println(power.request() + "充电");
}
}
// 适配器类,这里直接继承普通接口,不用实现目标接口,
static class PowerAdapter extends AndroidPower {
private HomePower homePower;
PowerAdapter(HomePower homePower){
this.homePower = homePower;
}
public String request() {
return this.homePower.homeRequest();
}
}
// 测试类public class Client {
public static void main(String[] args) {
new Android().charge(new AndroidPower());
//有了电源适配器安卓就可以使用220v充电
new Android().charge(new PowerAdapter(new HomePower()));
//使用匿名内部类来继承
// new Android().charge(new AndroidPower(){
// @Override
// public String request() {
// return new HomePower().homeRequest();
// }
// });
}
}
输出:同上
最后说一下,就像真实中一样,适配器一般解决历史遗留问题。所以适配器模式在软件设计阶段是不能出现的。个人推荐使用对象适配模式,其中也可以像注释的那样使用匿名内部类。