适配器模式
定义
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式主要应用于,当接口里定义的方法无法满足客户的需求,或者说接口里定义的方法的名称或者方法界面与客户需求有冲突的情况。
(引用百度百科)
适配器模式 (英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式有两种实现方式:
类适配器
和对象适配器
。
- 类适配器使用
继承关系
来实现- 对象适配器使用
组合关系
来实现。(引用维基百科)
比如像USB
转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。
类图
-
类适配器
-
对象适配器
实现
类适配器
1. 被适配者
public class Adaptee {
/**
* Info 级别
* @param msg
*/
public void slf4jInfo(String msg) {
System.out.println("[Adaptee INFO]: " + msg);
}
/**
* debug级别
* @param msg
*/
public void slf4jDebug(String msg) {
System.out.println("[Adaptee DEBUG]: " + msg);
}
}
2. 适配器
public interface Logger {
/**
* Info 级别
* @param msg
*/
void info(String msg);
/**
* debug级别
* @param msg
*/
void debug(String msg);
}
/**
* 类适配器
*/
public class Adaptor extends Adaptee implements Logger{
@Override
public void info(String msg) {
slf4jInfo(msg);
}
@Override
public void debug(String msg) {
slf4jDebug(msg);
}
}
3. Main
public class T {
public static void main(String[] args) {
Logger logger = new Adaptor();
logger.info("hello");
}
}
对象适配器
1. 被适配者
public class Adaptee {
public void info(String msg) {
System.out.println("[INFO]底层日志实现: Log4J2. " + msg);
}
public void debug(String msg) {
System.out.println("[DEBUG]底层日志实现: Log4J2. " + msg);
}
}
2. 适配器
/**
* 定义日志接口
*/
public interface Logger {
/**
* Info 级别
* @param msg
*/
void info(String msg);
/**
* debug级别
* @param msg
*/
void debug(String msg);
}
/**
* 适配器持有被适配者的引用
*/
public class LogAdaptor implements Logger{
Adaptee log4J = new Adaptee();
@Override
public void info(String msg) {
log4J.info(msg);
}
@Override
public void debug(String msg) {
log4J.debug(msg);
}
}
3. Main
public class T {
public static void main(String[] args) {
Logger logger = new LogAdaptor();
logger.info("hello");
}
}
总结
-
适配模式有两种,到底如何选择?
判断的标准主要有两个,一个是
Adaptee
接口的个数,另一个是Adaptee
和Target
的契合程度。- 如果 Adaptee 接口并不多,那两种实现方式都可以。
- 如果 Adaptee 接口很多,而且 Adaptee 和 Target 接口定义大部分都相同,那我们推荐使用类适配器,因为 Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。
- 如果 Adaptee 接口很多,而且 Adaptee 和 Target 接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。
-
应用场景
一般来说,适配器可看作为一种
补偿模式
,用来弥补设计上的缺陷。或者由于历史原因导致接口不统一,需要适配器适配两者不同接口。- 封装有缺陷的接口设计
- 统一多个类的接口设计
- 替换依赖的外部系统
- 兼容老版本接口
- 适配不同格式的数据
-
代理、桥接、装饰器、适配器 4 种设计模式的区别
代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。
- 代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是
控制访问,而非加强功能
,这是它跟装饰器模式最大的不同。 - 桥接模式:桥接模式的目的是
将接口部分和实现部分分离
,从而让它们可以较为容易、也相对独立地加以改变。 - 装饰器模式:装饰者模式在
不改变原始类接口
的情况下,对原始类功能进行增强
,并且支持多个装饰器的嵌套使用。 - 适配器模式:适配器模式是一种
事后的补救策略
。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。
- 代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是
结语
内容引自有:
- Head First 设计模式
- 图解设计模式
- Java设计模式之美(极客学院)
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。