1.适配器模式基本介绍
适配器模式(Adapter Pattern) 将某个类的接口转换成客户端期望的另一个接口表示,目的是增强兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。从用户的角度看不到被适配者,是解耦的 。其别名为包装器(Wrapper)
适配器模式属于结构型模式 。
主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
1.1 类适配器模式
基本介绍:Adapter类,通过继承 src类,实现 dst 类接口,完成src->dst的适配。
注意事项:
- Java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点, 因为这要 求dst必须是接口,有一定局限性;
- src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
- 由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵 活性增强了。
我们以一段代码来更形象地展示适配器模式:
Voltage220V类中的output220v()方法会输出220v电压,这与用户(phone)的需求不一致,因此我们声明接口IVoltage5V,其中有一个output5V()的方法需要让具体实现该接口的类实现该方法。让适配器类VoltageAdapter继承Voltage220V类并实现IVoltage5V接口中的方法。用户(phone)只需要找接口IVoltage5V便可以实现需求。
被适配的类:
package adapter.classadapter;
/**
* @Author Worm
* @Date 2020/8/11 20:07
* @Version 1.0
**/
//被适配的类
public class Voltage220V {
public int output220v() {
int src = 220;
System.out.println("电压:" + src);
return src;
}
}
dst类接口:
package adapter.classadapter;
/**
* @Author Worm
* @Date 2020/8/11 20:08
* @Version 1.0
**/
public interface IVoltage5V {
public int output5V();
}
适配器类:
package adapter.classadapter;
/**
* @Author Worm
* @Date 2020/8/11 20:09
* @Version 1.0
**/
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
int srcV = output220v();
int dstV = srcV / 44;
return dstV;
}
}
用户:
package adapter.classadapter;
/**
* @Author Worm
* @Date 2020/8/11 20:17
* @Version 1.0
**/
public class Phone {
public void charging(IVoltage5V iVoltage5V){
if(iVoltage5V.output5V()==5){
System.out.println("电压为5v,可以充电");
}else if(iVoltage5V.output5V()>5){
System.out.println("这是不行的");
}
}
}
客户端:
package adapter.classadapter;
/**
* @Author Worm
* @Date 2020/8/11 20:18
* @Version 1.0
**/
public class client {
public static void main(String[] args) {
System.out.println("类适配器");
Phone phone=new Phone();
phone.charging(new VoltageAdapter());
}
}
结果显示:
类适配器
电压:220
电压为5v,可以充电
1.2 对象适配器模式
修改上一种方法,我们不在让class VoltageAdapter继承class Voltage220V,而是
根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
package adapter.objectadapter;
/**
* @Author Worm
* @Date 2020/8/11 20:09
* @Version 1.0
**/
//适配器类
public class VoltageAdapter implements IVoltage5V {
// 聚合一个Voltage220V实例
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V output220v) {
this.voltage220V = output220v;
}
@Override
public int output5V() {
int dst = 0;
if (voltage220V != null) {
System.out.println("使用对象适配器");
int srcV = voltage220V.output220v();
dst = srcV / 44;
System.out.println("适配完成,输出的电压为:"+dst);
}
return dst;
}
}
1.3 接口适配器模式
介绍: 也称为缺省适配器模式(Default Adapter Pattern),该模式适用于实现一个接口而不想使用其所有方法的情况。
在开发中当我们不需要全部实现接口中所定义的方法时,可以先设计一个抽象类来实现接口,并在该类中为接口中的所有方法做一个默认实现(空方法),然后该抽象类的子类即可有选择的覆盖实现父类中的某些方法而无需实现接口的所有方法。
应用实例:
后续补充****************
2.总结
三种适配器的命名方式,是根据 src是以怎样的形式给到Adapter(在Adapter里的形式)来 命名的。 例如:
类适配器: 在Adapter里,将src当做类,并继承。
对象适配器: 在Adapter里持有src作为一个对象 。
接口适配器: 在Adapter里,将src作为一个接口,实现它。
Adapter模式最大的作用是将原本不兼容的接口融合在一起工作。实际开发中,要灵活使用无需拘泥于上述三种经典形式。