适配器模式的概念
适配器模式是结构型设计模式,主要为了解决程序运行时的兼容问题。打个比方说,现在的充电宝几乎可以为所有的手机充电,因为随着时代的发展,手机充电孔的设计出现了差别,有Type-C的,有其他的,充电宝如果想要成功的为不同的手机提供充电服务,只能去适配不同手机充电插孔,在这里就可以将充电宝看做是一个适配器,因为他将不同的充电插头连接到了一起。再举个例子,一台电脑如果想要读取内存卡中的数据,必须要借助读卡器来实现,而这个读卡器就是适配器的角色。
再比如说下面的设备,因为有些笔记本电脑没有网线的插口,所以需要借助一个可以适配网线的转接设备,我们可以将这个设备称为适配器:
适配器模式通常包含以下几个角色
- 需求接口 定义用户需要什么样的功能,比如充电宝可以为所有手机提供充电功能
- 适配者 适配者实现了需求接口中的功能方法,之所以叫适配者,是因为适配器就是在其基础上去兼容更多的功能
- 适配器 适配器模式的核心
代码示例及说明
在代码中使用适配器模式模拟充电宝为不同手机进行充电,假设现有的充电宝只能为安卓手机充电,现在希望充电宝可以为所有的手机充电,所以为其扩展更多的充电设施,实现对不同手机的兼容。
创建一个需求接口
/**
* 充电需求类-安卓
*/
public interface ChargeTarget {
/**
* 充电功能
*/
void charge();
}
上面的接口定义的功能表示只能为安卓手机充电
创建这个接口的实现类
/**
* 安卓充电功能实现类
*/
public class ChargeTargetImpl implements ChargeTarget{
private String type;
private ChargeAdapter adapter;
public ChargeTargetImpl(String type) {
this.type = type;
}
@Override
public void charge() {
if(type.equals("安卓")) {
System.out.println("正在为安卓手机充电");
}else if(type.equals("苹果")){
adapter = new ChargeAdapter();
adapter.charge();
}
}
}
实现了一个为安卓手机充电的功能,同时,适配器要对其功能进行扩展,所以这个实现类也是一个适配者,并且由于我不仅想要实现安卓充电还想实现为苹果手机充电,所以还要再添加一个表示为苹果手机充电实现
创建为苹果手机充电的实现类
public class AppleChargeTargetImpl implements ChargeTarget{
@Override
public void charge() {
System.out.println("正在为苹果手机充电");
}
}
最后创建一个适配器实现充电功能兼容安卓手机和苹果手机。
创建适配器
/**
* 充电功能适配器
*/
public class ChargeAdapter implements ChargeTarget{
private ChargeTarget chargeTarget;
@Override
public void charge() {
chargeTarget = new AppleChargeTargetImpl();
chargeTarget.charge();
}
}
适配器的主要作用是为了兼容苹果手机的充电功能,下面进行代码测试
public class test {
public static void main(String[] args) {
ChargeTarget c = new ChargeTargetImpl("安卓");
c.charge();
System.out.println("------------------------------------");
ChargeTarget c1 = new ChargeTargetImpl("苹果");
c1.charge();
}
}
输出结果:
适配器的适配工作是在适配者中完成的,在上面的示例中,适配者指的就是
ChargeTargetImpl类,这个类中包含一个适配器对象属性,它的作用就是在为手机充电时(调用charge()方法时)根据手机的类型适配不同的充电功能。
总结
当原有的功能不符合系统当下的要求,可以选择使用适配器模式去兼容更多的功能来匹配系统当下的需求;适配器模式解决的是当一个对象的功能在新的环境中无法处理当下环境的需求时,就可以使用适配器模式去关联更多的功能来满足新环境的要求。同时,适配器可以在原有功能的基础上适配新的功能,所以它提高了程序的灵活性和代码的复用性。