作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
阶段4、深入jdk其余源码解析
阶段5、深入jvm源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】
码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式主要应用于,当接口里定义的方法无法满足客户的需求,或者说接口里定义的方法的名称或者方法界面与客户需求有冲突的情况。
(引用百度百科)
适配器模式 (英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式有两种实现方式:
类适配器
和对象适配器
。
- 类适配器使用
继承关系
来实现- 对象适配器使用
组合关系
来实现。(引用维基百科)
比如像USB
转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。
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);
}
}
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);
}
}
public class T {
public static void main(String[] args) {
Logger logger = new Adaptor();
logger.info("hello");
}
}
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);
}
}
/**
* 定义日志接口
*/
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);
}
}
public class T {
public static void main(String[] args) {
Logger logger = new LogAdaptor();
logger.info("hello");
}
}
适配模式有两种,到底如何选择?
判断的标准主要有两个,一个是Adaptee
接口的个数,另一个是 Adaptee
和Target
的契合程度。
应用场景
一般来说,适配器可看作为一种补偿模式
,用来弥补设计上的缺陷。或者由于历史原因导致接口不统一,需要适配器适配两者不同接口。
代理、桥接、装饰器、适配器 4 种设计模式的区别
代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。
控制访问,而非加强功能
,这是它跟装饰器模式最大的不同。将接口部分和实现部分分离
,从而让它们可以较为容易、也相对独立地加以改变。不改变原始类接口
的情况下,对原始类功能进行增强
,并且支持多个装饰器的嵌套使用。事后的补救策略
。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。