作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我
定义
适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
特点
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
举例:不同第三方应用的登录SDK,登录授权接口不同,可封装出一层统一的登录授权接口。
优缺点
(1) 优点
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
- 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
(2) 缺点
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
模式结构
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
方式1:对象适配器--采用组合方式
方式2:类适配器--采用继承方式
具体实现
(1) 方式1--对象适配器--采用组合方式
目标接口和适配器
/**
* 目标接口
*/
public interface Target5V {
int chong5V();
}
/**
* 适配者类
*/
public class Voltage220 {
public int output220V(){
return 220;
}
}
/**
* 适配器类, 采用对象组合方式实现
*/
public class Adapter implements Target5V {
private Voltage220 voltage220;
public Adapter(Voltage220 voltage220) {
this.voltage220 = voltage220;
}
@Override
public int chong5V() {
return voltage220.output220V() / 44;
}
}
具体使用
public class App {
public static void main(String[] args) {
Voltage220 voltage220 = new Voltage220();
Adapter adapter = new Adapter(voltage220);
int voltage = adapter.chong5V();
System.out.println("voltage:" + voltage);
}
}
(2) 方式2--类适配器--采用继承方式
目标接口和适配器
/**
* 目标接口
*/
public interface Target5V {
void chong5V();
}
/**
* 适配者类
*/
public class Adaptee {
public void chong220V(){
System.out.println("充220V");
}
}
/**
* 适配器类, 采用继承实现
*/
public class Adapter extends Adaptee implements Target5V {
@Override
public void chong5V() {
System.out.println("chong5V:" + 220 / 44);
}
}
具体使用
public class App {
public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.chong5V();
adapter.chong220V();
}
}
实际应用
1、Android中的ListView Adapter,增加一个Adapter层来应对变化,将ListView需要的接口抽象到Adapter对象中,这样只要用户实现了Adapter的接口,ListView就可以按照用户设定的显示效果、数量、数据来显示特定的Item View。
2、java util中的List、Enumeration 接口转化为 Iterator 接口。