优点:把不兼容的接口适配成兼容,提高复用性。
缺点:目标只能为接口,使用有一定的局限性。
比如,家庭电源为220V,我手机充电只兼容5V,怎么办?
例子很简单:
电源5V:Power5V
电源220V:Power220V
充电方法:charging(Power220V power)
适配器:PowerAdapter
任务:使用适配器模式让充电方法兼容Power5V 接口
220V电源接口:
/**
* 这是一个电压220V的接口
*/
public interface Power220V {
int insert();
}
实现类:
/**
* 这是220V电源的实现类,返回220V电压
*/
public class Power220Impl implements Power220V {
@Override
public int insert() {
return 220;
}
}
在没适配器的情况下调用:
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Power220V power220V = new Power220Impl();
charging(power220V);
}
//充电方法
public void charging(Power220V power) {
int i = power.insert();
if (i == 220) {
Log.d("TAG", "电压为" + i + "你的手机炸了!");
}else{
Log.d("TAG", "电压为" + i + "你的手机正在安全充电!");
}
}
}

220V不合适手机充电,只能再做一个5V的接口:
/**
*这是一个电压5V的接口
*/
public interface Power5V {
int insert();
}
实现类:
/**
* 这是5V电源的实现类,返回5V电压
*/
public class Power5Impl implements Power5V {
@Override
public int insert() {
return 5;
}
}
充电方法charging(Power220V power)只兼容Power220V,怎么让它也兼容Power5V ?写个适配器。
/**
* 这是一个适配器
*/
public class PowerAdapter implements Power220V {
private Power5V power5V;
public PowerAdapter(Power5V power5V) {
this.power5V = power5V;
}
@Override
public int insert() {
return power5V.insert();
}
}
适配器类中把Power5V通过构造方法传进来,通过Power5V的实现方法去实现Power220V中的方法,就行了,其实适配器内容就是一个转换过程。
调用:
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Power220V power220V = new Power220Impl();
// charging(power220V);
Power5V power5V = new Power5Impl();
PowerAdapter powerAdapter = new PowerAdapter(power5V);
charging(powerAdapter);
}
//充电方法
public void charging(Power220V power) {
int i = power.insert();
if (i == 220) {
Log.d("TAG", "电压为" + i + "V你的手机炸了!");
} else {
Log.d("TAG", "电压为" + i + "V你的手机正在安全充电!");
}
}
}

这样就能把原本不兼容的接口适配成兼容,而且还不用动先前代码,符合设计模式六大原则中的开闭原则。
已完成测试!有不对的地方欢迎指出,感恩。
网友评论