1、概述
适配器模式将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,属于结构型模式。
2、模式结构
- Target:目标抽象类,定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类
- Adapter:适配器类,可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配
- Adaptee:适配者类,定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法
3、使用场景
- 使用一个已存在的类,但它的方法和你的要求不相同时
- 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作
4、优缺点
优点:
- 将目标类和适配者类解耦,引入一个适配器类来重用现有的适配者类,而无须修改原有代码
- 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一适配者类可以在多个不同的系统中复用
- 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握
- 不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类
5、实例
在开发中,我们可能会遇到原有的日志系统是保存日志文件中的,但其它项目想把日志保存在数据库中,这种情况下,可不改变日志原有的业务逻辑,扩展一个适配类来实现功能。
ILogFile,日志接口类
public interface ILogFile {
List<String> getLog();// 获取日志
void writeLog(List<String> list);// 写日志
}
LogFile:日志实现类,即Adaptee类
public class LogFile implements ILogFile {
@Override
public List<String> getLog() {
return null;
}
@Override
public void writeLog(List<String> list) {
}
}
ILogDbFile,数据库接口类,即Target类
public interface ILogDbFile {
void createLog(String log);
}
LogAdapter,数据库适配类,是Adapter类
public class LogAdapter implements ILogDbFile {
private LogFile logFile;
public LogAdapter(LogFile logFile) {
this.logFile = logFile;
}
@Override
public void createLog(String log) {
List<String> list = logFile.getLog();
list.add(log);
logFile.writeLog(list);
}
}
以上是对象适配器,在Android中,我们可以常见接口适配器,例如:
public interface ListAdapter extends Adapter {
...
}