定义
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。(来源百度百科)。
简单来说,就是一个原有的类功能满足现有的需求,在不修改原有的类的基础上,使用扩展类的方式满足现有需求,扩展类通过适配原有类从而满足现有的需求。
是一种结构型的设计模式。
分类
- 类适配器
- 对象适配器
类适配器
优点
- 提高类的复用
- 在不修改原有类的基础上满足功能
缺点
- 过多的使用适配器类,会让系统非常零乱,不易整体进行把握
- 由于Java单继承的限制,一个适配器类只能适配一个类
coding
我有一个以前的有线耳机,我新买了一个手机,但是新手机的耳机插口却是type-c的,所以我需要一个转换器来然我能够用以前的耳机听歌。
目标类:
public class TypeC {
public String outPut() {
return "接收到电脑的输入,由Type_c接口负责输出";
}
}
用户期待的功能类:
public interface HeadSet {
/**
* 输出音乐
*
* @return
*/
String outPutMusic();
}
适配器类:
public class TypeCAdapter extends TypeC implements HeadSet {
@Override
public String outPutMusic() {
System.out.println(outPut());
System.out.println("接收到type_c的输出,适配器开始适配");
return "适配完成,开始播放音乐";
}
}
测试类:
public class Phone {
public static void main(String[] args) {
TypeCAdapter typeCAdapter = new TypeCAdapter();
System.out.println(typeCAdapter.outPutMusic());
}
}
输出:
类图
对象适配器
用户所期待的功能,定义成一个接口,用户只负责调用这个接口,而这个接口具体是如何实现的,用户并不知道,也就屏蔽了底层实现细节,这有这个接口是实现类才知道具体的实现细节。
优点
- 提高类的复用
- 在不修改原有类的基础上满足功能
- 满足多用组合,少用继承的要求
缺点
- 过多的使用适配器类,会让系统非常零乱,不易整体进行把握
源码参照
Java io流、mybatis日志模块的设计
coding
用户所期待的功能:
public interface Logger {
boolean isDebugEnabled();
void debug(String msg);
void debug(String msg, Object... args);
}
适配器类:
适配slf4j的日志实现
public class Slf4jImpl implements Logger {
//保存slf4j的实现,具体的日志实现功能由它负责
private org.slf4j.Logger slf4jLogger;
public Slf4jImpl(String clazz) {
this.slf4jLogger = LoggerFactory.getLogger(clazz);
}
@Override
public boolean isDebugEnabled() {
return slf4jLogger.isDebugEnabled();
}
@Override
public void debug(String msg) {
slf4jLogger.debug(msg);
}
@Override
public void debug(String msg, Object... args) {
slf4jLogger.debug(msg, args);
}
}
总结
当原有类的功能不能完全满足现有需求的时候,我们应该考虑适配器模式,这样即可以使用原有类的部分功能,又能满足现有需求,避免重复的coding,也能使代码结构清晰。