适配器模式,在项目里经常用到吧!说一说都在什么地方,用到了适配器模式?对它的理解,能有多少呢?能说出多少呢?遇到问题又能解决多少呢?被这一连串问题炮轰,还能对答如流的,肯定是高手了,不要羡慕别人了,现在就开始理解一下吧!适配器模式,将一个类的接口转换为客户需要的接口,使原本不兼容的类可以一起工作,属于结构型模式。
业务场景:不同产品、不同厂家,功能类似,而接口不同的问题。
适配器模式分类:类适配、对象适配、接口适配三种形式。
一、类适配模式编码;
业务场景说明:生活用电是220v,而手机充电是5v,那么如何给手机充电呢,那就需要一个手机充电的适配器。
1.定义电压接口;
/**
* 1.电压接口
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public interface IVoltage {
//输出电压
public int output();
}
2.生活中用电的实现类;
/**
* 2.生活中的电压
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public class LifeVoltage implements IVoltage {
private static final int voltage = 220;
@Override
public int output() {
return voltage;
}
}
3.家电接口;
/**
* 3.家电接口
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public interface IHomeAppliance {
// 充电,接入电源
public void charge(int voltage);
}
4.手机是家电的实现类;
/**
* 4.手机是家电的一种
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public class MobilePhone implements IHomeAppliance{
private static final int mobileVoltage = 5;
@Override
public void charge(int voltage) {
if(voltage == mobileVoltage){
System.out.println("手机可以正常充电,电压为5V");
}else{
System.out.println("手机不能正常充电,电压为" + voltage + "V");
}
}
}
5.手机充电适配器;
/**
* 5.1 手机充电器(适配器)---- 类适配器
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public class MobilePhoneChargerAdapter extends LifeVoltage implements IVoltage {
@Override
public int output(){
int liftVoltage = super.output();
int mobilePhoneValtage = liftVoltage / 44;
return mobilePhoneValtage;
}
}
6.应用,给手机充电;
public static void main(String[] argo){
// 类适配器测试
MobilePhoneChargerAdapter mobilePhoneChargerAdapter = new MobilePhoneChargerAdapter();
// 创建一个手机对象
IHomeAppliance mobilePhone = new MobilePhone();
// 给手机充电,使用类适配器获取电压
mobilePhone.charge(mobilePhoneChargerAdapter.output());
}
测试结果:
手机可以正常充电,电压为5V
二、对象适配模式****编码;
同样的业务场景,只是在适配类上有所区别:与被适配器类的关系,由泛化关系(继承)变为依赖关系(组合或聚合)。
5.手机充电适配类,看关键代码;
/**
* 5.2 手机充电器(适配器)---- 对象适配器
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public class MobilePhoneChargerAdapter implements IVoltage {
private LifeVoltage lifeVoltage;
public MobilePhoneChargerAdapter(LifeVoltage lifeVoltage) {
this.lifeVoltage = lifeVoltage;
}
@Override
public int output() {
int liftVoltage = lifeVoltage.output();
int mobilePhoneValtage = liftVoltage / 44;
return mobilePhoneValtage;
}
}
说明:被适配类是LifeVoltage ,在类适配中是继承;而在对象适配模式中,变成了依赖,在实例化适配类时传入。
6.应用,给手机充电;
public static void main(String[] argo){
// 获取手机充电适配器,并传入生活用电
MobilePhoneChargerAdapter mobilePhoneChargerAdapter = new MobilePhoneChargerAdapter(new LifeVoltage());
// 使用电压
IHomeAppliance mobilePhone = new MobilePhone();
// 对象适配器
mobilePhone.charge(mobilePhoneChargerAdapter.output());
}
测试结果:
手机可以正常充电,电压为5V
三、接口适配模式编码;
接口适配器模式,也是缺省适配器模式。三句话,三个要点:
1)当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口。
2)在抽象类中,为接口中每个方法提供一个默认的空方法实现。
3)最后,该抽象类的子类就可以有选择地覆盖父类的某些方法来实现需求。
5.电压适配接口;
/**
* 5.电压适配器接口
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public interface IVolatageAdapter {
// 适配220电压
public int voltage220v();
// 适配5v电压
public int voltage5v();
}
6.电压抽象接口实现了电压适配接口,并在每个方法中提供一个默认的空实现。
/**
* 6.抽象类实现接口---空实现
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public abstract class AbstractAdapter implements IVolatageAdapter{
@Override
public int voltage220v(){
return 0;
}
@Override
public int voltage5v(){
return 0;
}
}
7.手机充电适配器的实现;
/**
* 7. 手机充电器(适配器)---接口适配器
* @author FengJuan
* @date 2022年2月25日
* @Description
*
*/
public class MobilePhoneChargerAdapter extends AbstractAdapter{
@Override
public int voltage5v(){
// 简化编码,直接返回
return 5;
}
}
8.应用,给手机使用适配器充电;
public static void main(String[] argo){
// 获取手机充电适配器
IVolatageAdapter mobilePhoneChargerAdapter = new MobilePhoneChargerAdapter();
// 使用电压
IHomeAppliance mobilePhone = new MobilePhone();
// 接口适配器
mobilePhone.charge(mobilePhoneChargerAdapter.voltage5v());
}
测试结果:
手机可以正常充电,电压为5V
回到最初的问题,项目中哪些地方用到了适配器模式?它们大多数又都使用了哪种类型的适配器模式?
感觉有用,请关注同名公众号吧~!
网友评论