目录
适配器模式
适配器模式(Adapter(参考:词语解释) Pattern)在计算机编程中,将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
作用:适配器模式的主要作用是解决接口不兼容的问题,使得原本不能协同工作的类能够一起工作。它通过对现有类的适配,生成新的类来满足客户端的需求。
定义
英文原话
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
直译
将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
如何理解呢?
字面理解
当我们说“适应(
adapt
)”,我们通常指的是当环境或某个元素与我们的预期(expect
)不一致时,我们需要进行的调整。在编程中,这种“适应”的概念被适配器(adapter
)模式(pattern)很好地体现。
适配器模式的核心思想是将一个类的接口转换成客户端所期望(expect
)的另一种接口。这样,即使两个类原本因为接口不兼容(incompatible
)而无法协同工作,通过适配器(adapter
),它们也可以顺利地在一起工作。
简而言之,当提供的接口与我们期望的接口不匹配时,适配器模式就派上了用场。它作为一个桥梁,连接了不兼容(incompatible
)的接口,使它们能够协同工作,实现了真正的“适应”。
案例分析
适配器模式本身并不复杂,充分理解它的概念、作用,就能掌握该模式。
下面我们从四个实际的例子出发,来理解一下适配器模式。
1. TypeCInterface to TypeAInterface
举个例子,客户端需要使用TypeAInterface类型,而我们这里只有TypeCInterface类型,那么就可以使用适配器将TypeCInterface适配成TypeAInterface这样客户端就能正常使用。
2. 电源适配器
再举个生活中更常见的例子,笔记本电脑需要直流电供电,而公共电网提供的是交流电。因此,需要一个电源适配器(Power Adapter)(详细阐述见:电源适配器)来将交流电适配成直流电,以便给笔记本电脑供电。
3. HDMI to VGA
电源适配器还是不好理解?(对于这个词我一开始也是不懂的,原因是原来脑袋里没有适配器(参考:词语解释)的概念,只有充电器的概念)
好的,我们再来举个更容易理解的例子。
假设:我有一块带有VGA和HDMI接口屏幕,一个老笔记本电脑只有一个VGA接口可用
这个笔记本电脑可以是只有一个视频输出接口VGA接口,或者有一个VGA接口和一个HDMI接口,但是HDMI接口被占用了,因为已经外外接了一台显示器,此时还想再外接一台显示器
然而手头只有一根HDMI线,那这台显示器和笔记本电脑没办法直接一起工作的,因为接口不适配。
此时可以选择购买一条VGA线连接,但这似乎不是很有必要,现在VGA接口逐渐被替代了,用的较少了
随着显示技术的不断发展,更先进的接口标准如HDMI、DisplayPort(DP)等逐渐取代了VGA接口。这些新标准提供了更高的带宽、更好的图像质量和更多的功能支持。
因此只为了适配这台笔记本电脑的VGA接口,可以使用一个HDMI转VGA(HDMI to VGA)的适配器,就可以使这个显示器与笔记本一起工作了。
4. Type-C拓展坞
到此,我们已了解,接口不一致(可能是物理形态,物理外观都不一致,也可能是支持的协议、标准不一致),带来了无法一起工作的问题,因此,统一的接口多么重要。如果接口不同则需要适配器进行适配。
目前USB Type-C(USB-C)因其便利性、高速传输和充电功能而逐渐成为主流。
现在的笔记本电脑主流接口(参考:目前主流接口类型)是Type-C,用户常通过连接一个拓展坞(也称为扩展坞或接口转换器)来扩展其功能。这个拓展坞就是一个适配器,它能够将单一的Type-C接口转换为多个其他类型的接口,如PD接口、HDMI接口、USB Type-A 3.0接口、USB Type-C 3.0接口、3.5mm音频接口(支持音频和通话),从而为用户提供了更多的连接选项和便利。
这里拓展出PD接口,即Power Delivery,来给笔记本电脑供电,因为拓展坞占用了Type-C接口,如果笔记本电脑需要通过这个拓展坞来供电,通常会通过拓展坞上标记为“PD”或支持相应充电功率的Type-C接口来连接电源适配器。
这种接法非常常见:
比如手机外接移动硬盘,本身的Type-C接口被移动硬盘连接线占用,而连接大容量移动硬盘需要额外供电,此时就需要适配器将手机的Type-C接口扩展出PD接口(用来供电)和USB接口(用来连接移动硬盘);
再比如手机的Type-C接口扩展出HDMI接口进行投屏,往往还会同时扩展出DP接口,因为当投屏所需的电力超过了手机直接供电的能力,带不动,需要为投屏提供额外的电力,所以比较常见的接法是手机Type-C接口接Type-C拓展坞,拓展坞上扩展的DP接口(标记为支持PD)接手机Type-C充电线供电,拓展坞上扩展出的HDMI接口接电视机,显示器进行投屏。
当然现在主流的笔记本电脑不只一个Type-C接口。现代笔记本电脑通常会配备多个Type-C接口,以便用户能够同时连接多个设备,或者使用一个接口进行数据传输,而另一个接口进行充电。
这里只是说明Type-C接口能够扩展出的功能接口
另外现在一些显示器带有USB Type-C接口,同时显示器上自带USB Type-A接口(Type-C接口具备数据传输功能,因此可以扩展出USB Type-A接口), 3.5mm音频接口(Type-C接口具备音频传输功能,可以扩展出3.5mm音频接口)等扩展接口,笔记本电脑通过Type-C一线连接激活显示器的扩展接口,移动硬盘,键鼠插拔应用轻松搞定,还支持为笔记本反向充电(Type-C接口具备供电功能),摆脱笔记本本身电源线。这种显示器不只是笔记本副屏,同时也充当笔记本电源、拓展坞。这个拓展坞上面的所有接口都是由Type-C接口适配出来的。
想一想,你将键盘、鼠标等外设、3.5mm有线耳机接入到显示器扩展接口上,然后只需要将显示器的Type-C线连接到笔记本Type-C接口,就能正常使用,是多么方便。就不需要每次插电源、插HDMI线、插鼠标、插键盘了。实在是太爽了、太酷了!
如果我们的笔记本电脑没有Type-C口,那就需要插三根线来替代,一根HDMI进行视频传输,一根USB上行线,激活显示器扩展接口,还有一根电源线供电。
现在能体会到Type-C接口的强大了吧!
由此可见,iPhone 15使用更先进的USB Type-C口,而不再使用先前的Lighting接口,这是一个很大的改进,带来了更多的可能性。
Type-C接口是USB接口的一种类型,具有基本的充电和数据传输功能,还支持显示输出、音频传输等多种功能。
iPhone 15使用Type-C接口能够支持4k 60Hz的视频信号传输。用户可以将设备连接到外部显示器或电视等设备上,实现大屏幕显示,观看高清视频等。同时也支持供电,现在市面上的一些带反向供电的显示器就是通过USB Type-C接口实现一根线同时支持供电以及视频传输。
Type-C接口凭借其高通用性、多功能性和便捷性,在现代电子设备中得到了广泛的应用。
三个角色
UML类图
适配器模式包含以下三种角色:
- 目标接口(Target):这是客户端所期望的接口。目标可以是抽象类或接口,定义客户端使用的域特定方法。
- 适配者(Adaptee):需要被适配的类。这个类通常是一个已经存在的类,它的接口与客户端所期望的接口不一致。
- 适配器(Adapter):将适配者的接口转换成目标接口以供客户端使用。适配器可以是抽象类或者接口,但是通常是一个具体的类。适配器持有适配者的引用,并通过继承或实现目标接口,同时调用适配者的方法,实现接口转换的功能。
代码示例
下面是一个简单的Java代码示例,展示适配器模式如何工作:
// 目标接口(Target)
public interface Target {
void request();
}
// 适配者(Adaptee)
public class Adaptee {
public void specificRequest() {
System.out.println("Called specificRequest()");
}
}
// 适配器(Adapter)
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
// 实现目标接口的方法,通过调用适配者的方法实现
@Override
public void request() {
adaptee.specificRequest();
}
}
// 客户端(Client)
public class Client {
public static void main(String[] args) {
// 创建适配者对象
Adaptee adaptee = new Adaptee();
// 创建适配器对象,并传入适配者对象
Target target = new Adapter(adaptee);
// 客户端调用目标接口的方法
target.request();
}
}
/* Output:
Called specificRequest()
*///~
在这个例子中,Target
是客户端所期望的接口,Adaptee
是需要被适配的类,它的接口是 specificRequest()
。Adapter
类实现了 Target
接口,并持有 Adaptee
的引用。在 Adapter
的 request()
方法中,调用了 Adaptee
的 specificRequest()
方法。在 Client
中,我们创建了 Adaptee
和 Adapter
的实例,并通过 Adapter
来调用 Adaptee
的方法,实现了接口之间的适配。
适配器模式分类
- 类适配器:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配。
- 对象适配器:把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被支配者。
由于Java语言单继承,不支持多继承,因此可以将对象适配器模式看作是通过组合的方式替代类适配器模式多继承的问题。
类适配器模式代码示例:
// 被适配者:老旧的类
public class LegacyClass {
public void legacyMethod() {
System.out.println("Called legacyMethod()");
}
}
// 目标接口:新系统期望的接口
public interface TargetInterface {
void request();
}
// 类适配器:通过多重继承实现接口匹配
public class ClassAdapter extends LegacyClass implements TargetInterface {
@Override
public void request() {
// 调用被适配者的方法,并可能加入一些适配逻辑
legacyMethod();
// 其他适配逻辑...
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
TargetInterface adapter = new ClassAdapter();
adapter.request();
}
}
/* Output:
Called legacyMethod()
*///~
对象适配器代码示例:
在对象适配器中,我们不会通过继承 LegacyClass
来实现 TargetInterface
,而是将 LegacyClass
的一个实例作为适配器类的一个成员变量
// 被适配者:还是老旧的类
// (与类适配器中的被适配者相同)
// 目标接口:与类适配器中的目标接口相同
// (与类适配器中的目标接口相同)
// 对象适配器:持有被适配者的实例,并实现目标接口
public class ObjectAdapter implements TargetInterface {
private LegacyClass legacy;
public ObjectAdapter(LegacyClass legacy) {
this.legacy = legacy;
}
@Override
public void request() {
// 调用被适配者的方法,并可能加入一些适配逻辑
legacy.legacyMethod();
// 其他适配逻辑...
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
LegacyClass legacy = new LegacyClass();
TargetInterface adapter = new ObjectAdapter(legacy);
adapter.request(); // 输出:Called legacyMethod()
}
}
/* Output:
Called legacyMethod()
*///~
下面我们介绍的主要是对象适配器模式。因为它解决了多继承的问题。
示例解析:以电源适配器为例方便理解
为了更好地理解适配器模式在日常生活中的应用,我们可以考虑一个常见的例子:电源适配器。假设你有一个来自国外的电子设备,它需要110V的电压,但是你的家庭电源提供的是220V的电压。此时,你就需要一个电源适配器来将220V的电压适配到设备所需的110V。
现在,我们将这个场景用Java代码来表示:
// 目标接口(电器设备期望的电压接口)
public interface Voltage {
int getVoltage();
}
// 适配者(家庭电源,提供220V电压)
public class PowerSupply {
public int provideVoltage() {
return 220; // 家庭电源提供220V电压
}
}
// 适配器(电源适配器)
public class VoltageAdapter implements Voltage {
private PowerSupply powerSupply;
public VoltageAdapter(PowerSupply powerSupply) {
this.powerSupply = powerSupply;
}
// 将家庭电源的电压适配到设备所需的电压
@Override
public int getVoltage() {
int rawVoltage = powerSupply.provideVoltage();
// 假设这里简单地通过除以2来模拟电压的适配(实际上会更复杂)
int adaptedVoltage = rawVoltage / 2;
System.out.println("适配后的电压:" + adaptedVoltage + "V");
return adaptedVoltage;
}
}
// 客户端(使用电器设备的用户)
public class Client {
public static void main(String[] args) {
// 创建一个家庭电源对象
PowerSupply powerSupply = new PowerSupply();
// 创建一个电源适配器对象,并将家庭电源传入
VoltageAdapter voltageAdapter = new VoltageAdapter(powerSupply);
// 客户端通过适配器获取适配后的电压
int voltage = voltageAdapter.getVoltage();
System.out.println("设备需要的电压:" + voltage + "V");
}
}
/* Output:
适配后的电压:110V
设备需要的电压:110V
*///~
在这个例子中,Voltage
接口是目标接口,它代表了电器设备期望的电压接口。PowerSupply
类是适配者,它提供了家庭电源的电压(220V)。VoltageAdapter
类是适配器,它实现了 Voltage
接口,并将 PowerSupply
对象作为私有成员变量持有。在 VoltageAdapter
的 getVoltage()
方法中,它调用了 PowerSupply
的 provideVoltage()
方法获取原始电压,然后进行了适配(这里简单地通过除以2来模拟),最后返回适配后的电压。
在 Client
类中,我们创建了一个 PowerSupply
对象和一个 VoltageAdapter
对象,并将 PowerSupply
对象传入 VoltageAdapter
的构造函数中。然后,我们通过 VoltageAdapter
的 getVoltage()
方法获取适配后的电压,并打印出来。这样,客户端就可以通过适配器使用家庭电源来为电器设备提供所需的电压了。
示例2:DP转HDMI适配器
假设我有一台显示器只有DP接口,而我有一台笔记本只有HDMI接口,我需要连接该显示器,但是我遇到了一个接口不适配的问题?导致无法直接连接工作。
于是我买一个DP转Hdmi的适配器,将显示屏的DP线转成HDMI线接到笔记本电脑,正常点亮显示器。
购买的DP转HDMI的转换器就是一个很好的适配器模式的实际应用例子。
在这个例子中:
- 目标接口(Target):是笔记本电脑的HDMI接口,它期望接收到HDMI信号来驱动显示器。
- 适配者(Adaptee):是显示屏的DP线,它提供了DisplayPort(DP)信号,这是笔记本电脑HDMI接口不能直接识别的。
- 适配器(Adapter):就是DP转HDMI的转换器,它将DisplayPort(DP)信号转换成HDMI信号,使得原本不能直接连接到笔记本电脑的显示屏DP线能够通过HDMI接口正常工作。
当你将显示屏的DP线连接到DP转HDMI的转换器,然后再将转换器的HDMI端连接到笔记本电脑的HDMI接口时,适配器就起到了将适配者(DisplayPort信号)转换成目标接口(HDMI信号)所需格式的作用,从而实现了显示屏与笔记本电脑的连接和正常显示。这就是适配器模式在日常生活中的一个典型应用。
为了更贴近DP转HDMI转换器的适配器模式示例,我们可以创建一个简化的代码模型。在这个模型中,我们将模拟DisplayPort
接口、HDMI
接口、DisplayPortDevice
(适配者)和DisplayPortToHDMIAdapter
(适配器)。
// 目标接口(HDMI接口)
public interface HDMI {
void connectHDMI();
}
// 适配者(DisplayPort设备)
public class DisplayPortDevice {
public void connectDisplayPort() {
System.out.println("DisplayPort 设备已连接");
}
}
// 适配器(DP转HDMI适配器)
public class DisplayPortToHDMIAdapter implements HDMI {
private DisplayPortDevice displayPortDevice;
public DisplayPortToHDMIAdapter(DisplayPortDevice displayPortDevice) {
this.displayPortDevice = displayPortDevice;
}
@Override
public void connectHDMI() {
// 适配过程:调用适配者的connectDisplayPort方法
// 在这里只是模拟,实际上可能包含更复杂的信号转换逻辑
displayPortDevice.connectDisplayPort();
System.out.println("DisplayPort 信号已适配为 HDMI 信号");
}
}
// 客户端(使用适配器的代码)
public class Client {
public static void main(String[] args) {
// 创建适配者(DisplayPort设备)
DisplayPortDevice displayPortDevice = new DisplayPortDevice();
// 创建适配器(DP转HDMI适配器),并传入适配者
HDMI hdmiAdapter = new DisplayPortToHDMIAdapter(displayPortDevice);
// 客户端使用目标接口(HDMI接口)的方法
hdmiAdapter.connectHDMI();
}
}
/* Output:
DisplayPort 设备已连接
DisplayPort 信号已适配为 HDMI 信号
*///~
在上面的代码中,HDMI
接口代表笔记本电脑上的HDMI接口,它期望一个设备通过connectHDMI
方法连接。DisplayPortDevice
类代表显示屏的DisplayPort设备,它有一个connectDisplayPort
方法来表示连接DisplayPort线。DisplayPortToHDMIAdapter
类实现了HDMI
接口,并在内部持有一个DisplayPortDevice
对象。当客户端调用hdmiAdapter.connectHDMI()
时,适配器内部会调用适配者的connectDisplayPort
方法,并模拟信号转换的过程。最终,在控制台上会打印出连接和适配成功的消息。
领域驱动设计中的防腐层
当采用领域驱动设计(DDD, Domain-Driven Design)时,防腐层(Anticorruption Layer)是一个关键的概念,用于隔离领域模型与外部系统之间的交互,从而保护领域模型的纯洁性。
防腐层的主要目的是确保领域模型不会受到外部系统(如遗留系统、外部API等)的影响,这些外部系统可能具有与领域模型不兼容的接口、数据模型或行为。防腐层充当一个中间层,它负责将外部系统的数据转换为领域模型可以理解的格式,并可能隐藏外部系统的复杂性。
这里的防腐层将外部系统的数据转换成领域模型的过程可以看作是适配器模式的适配过程。
Java io类库示例:适配器VS装饰器模式
适配器的作用就是将一个接口适配到另一个接口,在Java的I/O类库有很多这样的需求。
InputStreamReader和OutputStreamWriter类分别继承了Reader和Writer接口,
但是要创建它们的对象必须在构造函数中传入一个InputStream和OutputStream的实例。
InputStreamReader和OutputStreamWriter的作用也就是将InputStream和OutputStream适配到Reader和Writer。
StringReader将一个String类适配到Reader接口,ByteArrayInputStream适配器将byte数组适配到InputStream流处理接口。
回顾下上一篇装饰器模式的示例2类图
之前提到,Java io类库借鉴了装饰器模式,而不等同于装饰器模式,因为类型发生了变化,没有递归的组合装饰器,不是严格的经典的装饰器模式。装饰器模式注重的是类型不变!
// 创建一个 FileInputStream 对象,用于从文件中读取数据
FileInputStream fis = new FileInputStream(exampleFile);
// 使用 InputStreamReader 读取字符,并指定编码为 UTF-8
Reader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
// 使用 BufferedReader 包装 InputStreamReader,添加缓冲功能
BufferedReader br = new BufferedReader(isr);
现在我们进一步分析下这个过程:
String =1=> InputStream(FileInputStream) =2=> Reader(InputStreamReader) =3=> Reader(BufferedReader)
这个过程中步骤2
是适配器适配过程,步骤3
可以看作是装饰器装饰过程。
1
是从文件到字节流的直接映射,不涉及适配器或装饰器。- 步骤
2
:FileInputStream 到 InputStreamReader:这是一个适配器(Adapter)过程。InputStreamReader
是一个适配器类,它将字节流(InputStream
,这里是FileInputStream
)适配为字符流(Reader
)。这是因为在 Java I/O 体系中,字节流和字符流是两个独立的体系,而InputStreamReader
正是连接这两个体系的桥梁。 - 步骤
3
:InputStreamReader 到 BufferedReader:这通常被看作是一个装饰器(Decorator)过程。BufferedReader
是一个装饰器类,它实现了Reader
接口,并包装了另一个Reader
对象(这里是InputStreamReader
)。BufferedReader
为Reader
添加了缓冲功能,使得读取操作更加高效,并且提供了readLine()
等方便的方法。
关键点在于2
步骤后类型发生了变化,3
步骤类型不变。
现在我们就可以对上一篇装饰器模式中提到的
适配器模式与装饰器模式的区别:
装饰器与适配器模式都有一个别名就是包装模式(Wrapper),它们的作用看似都是起到包装一个类或对象的作用,但是使用它们的目的是很不一样的。
- 适配器模式的意义是要将一个接口转变成另外一个接口,它的目的是通过改变接口来达到重复使用的目的;
- 而装饰器模式不是要改变被装饰对象的接口,而恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方法而提升性能。所以这两个模式设计的目的是不同的。
有了更深的认识
适配器模式的优点
- 接口转换:适配器模式可以将不兼容的接口转换成客户端所期望的接口,从而使得客户端可以正常使用这些类。
- 代码复用:适配器模式可以在不修改原有代码的基础上,将一个类的接口转换成客户端所期望的接口,从而使得原有的代码可以被复用。
- 解耦:适配器模式将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码。
适配器模式的应用场景
-
系统扩展:当系统需要扩展时,可能会引入新的类和接口,而原有的客户端可能无法直接使用这些新的类和接口。通过适配器模式,可以将新的接口转换成客户端所期望的接口,使得客户端可以正常使用这些扩展的功能。
修改一个已经投产中的系统时,需要对系统进行扩展,此时使用一个已有的类,但这个类不符合系统中的接口,这时使用适配器模式是最合适的,它可以将不符合系统接口的类进行转换,转换成符合系统接口的、可以使用的类。
-
接口转换:在不同的组件或系统之间,可能存在不兼容的接口定义。通过适配器模式,可以将一个组件或系统的接口转换成另一个组件或系统所期望的接口,从而使得它们可以相互协作。
-
兼容老版本:当系统中存在一些老版本的组件或系统时,可能需要将这些已存在的老版本的接口转换成新的接口。通过适配器模式,可以实现这种转换,使得新老版本的组件或系统可以相互协作。
这种设计模式在解决接口不兼容问题、系统扩展、接口转换和兼容老版本等方面具有广泛的应用。
拓展阅读
1. 目前主流接口类型
目前USB Type-C(USB-C)因其便利性、高速传输和充电功能而逐渐成为主流。
HDMI和DisplayPort仍然是视频传输的主流接口。
RJ45(以太网接口)和3.5mm耳机孔在特定设备和应用中仍然重要。
而SD卡槽和Thunderbolt接口则针对特定用户群体和高端设备。
Thunderbolt主要是一种协议,而不是具体的物理接口实现。早期的Thunderbolt接口物理外观和Mini DisplayPort接口相同,但在Thunderbolt 3及之后,其物理接口改为了USB Type-C。这种改变使得Thunderbolt接口在物理形态上更加统一和通用。
现在主流的笔记本接口类型多以USB Type-C为主,Type-C接口不仅支持传统的充电和数据传输功能,还支持反向供电。如连接到支持反向供电的显示器时,笔记本电脑可以通过Type-C接口从显示器获取电力,从而无需外接电源适配器即可工作。这种功能对于需要长时间移动办公或旅行的用户来说尤为方便。
现在主流的接口类型主要可以分为以下几类
USB接口
- USB Type-A:这是传统的USB接口,虽然在新型设备上逐渐减少,但在许多老设备、外部设备和一些配件上仍然常见。
- USB Type-C(USB-C):
- 物理外形小巧,正反插皆可,方便用户使用。
- USB 2.0和USB 3.x:支持USB支持USB 2.0和USB 3.x协议,数据传输速度高达10Gbps(USB 3.2 Gen 2x2)。
- Power Delivery(PD):Type-C接口支持PD协议,这允许设备通过USB接口进行快速充电。通过PD协议,Type-C接口可以支持高达100W的充电功率。
- DisplayPort和HDMI:虽然这些主要是视频传输协议,但Type-C接口通过适配器或集成技术,可以支持DisplayPort和HDMI信号的传输。
- 雷电(Thunderbolt):在某些高端设备上,Type-C接口可能支持雷电协议,从而提供更高的数据传输速度和更多的功能。
- 其他协议:Type-C接口还可能支持其他协议,如MHL、USB4等,具体取决于设备和制造商的实现。
- USB Type-C广泛应用于智能手机、平板电脑、笔记本电脑等。
USB Type-A和USB Type-C物理外观不同,但在支持的协议方面,它们可能相同或有所重叠。USB2.0, USB3.0说的是USB的协议类型,它可以有不同的物理实现无论是Type-A还是Type-C,它们都可以支持USB 2.0和USB 3.x协议。USB 2.0提供基本的数据传输速度,而USB 3.x(包括3.0、3.1和3.2)则提供更高的数据传输速度和效率。
视频输出接口
- HDMI:
- 支持高清视频和音频传输,常见版本有HDMI 1.4、HDMI 2.0和HDMI 2.1。
- 广泛应用于电视、显示器、投影仪等设备。
- DisplayPort(DP):
- 另一种高清视频传输接口,支持更高的分辨率和刷新率。
- 在高端显示器和游戏本中较为常见。
网络接口
- RJ45(以太网接口):
- 用于连接有线网络,提供稳定、高速的网络连接。
- 在一些专业设备、游戏本和台式机上仍然常见。
音频接口
- 3.5mm耳机孔:
- 支持音频输出和输入,常用于连接耳机、麦克风等音频设备。
- 在许多笔记本电脑和移动设备上仍然可见。
其他接口
- SD卡槽:
- 用于读取SD卡和Micro SD卡等存储设备,常见于数码相机和一些便携式设备。
- Thunderbolt接口:
- 由Intel和Apple共同开发,提供高速数据传输和视频传输功能,同时支持充电。
- 主要在高端笔记本和专业设备上出现,如Apple的MacBook Pro和一些高性能工作站。
Type-C接口是USB接口的一种类型,除了具有基本的充电和数据传输功能,还支持显示输出、音频传输等多种功能。
根据USB Type-C Alternate Mode技术规范,Type-C接口能够支持视频信号传输。通过支持DisplayPort、HDMI、VGA等各种视频输出协议的适配器或线缆,用户可以将设备连接到外部显示器或电视等设备上,实现大屏幕显示,观看高清视频等。同时也支持供电,现在市面上的一些带反向供电的显示器就是通过USB Type-C接口实现一根线同时支持供电以及视频传输。
Type-C接口凭借其高通用性、多功能性和便捷性,在现代电子设备中得到了广泛的应用。
注意:
Type-C接口虽然具有统一的物理外形,但在具体实现上可能存在差异。以下是关于Type-C接口的具体实现差异和相关信息的详细解释:
物理外形
Type-C接口的物理外形为椭圆形孔洞,尺寸大约为8.3mm x 2.5mm,这使得它相较于传统的USB接口更加小巧,适用于便携式设备。
功能差异
- 虽然Type-C接口在物理外形上统一,但其具体功能实现可能因设备而异。例如,某些Type-C接口可能仅支持数据传输,而另一些则可能同时支持数据传输和充电功能。
- Type-C接口还支持多种USB标准,包括USB 2.0、USB 3.0、USB 3.1等,不同的USB标准将影响数据传输速度和充电功率。
数据传输速度
Type-C接口支持高达10Gbps的数据传输速度(根据USB 3.1规范),但具体实现取决于设备和线缆的支持情况。如果设备或线缆仅支持USB 2.0标准,则数据传输速度将大大降低。
充电功率
Type-C接口支持高达100W的功率传输(根据USB Power Delivery规范),但并非所有Type-C接口都支持如此高的充电功率。设备的充电功率取决于其内部电路设计和所使用的充电协议。
其他功能
除了数据传输和充电功能外,Type-C接口还支持视频输出、音频传输等其他功能。这些功能的实现同样取决于设备和线缆的支持情况。
兼容性和标准
虽然Type-C接口具有统一的物理外形和连接标准,但不同品牌和制造商的设备可能存在兼容性问题。因此,在购买转接器、线缆或其他配件时,需要确认其是否与自己的设备兼容。
智能化特性
一些高端的Type-C接口内置了智能芯片,能够自动识别连接设备的类型,并根据需要调整功率传输和数据传输速率。这种智能化特性提高了设备的兼容性和使用便利性。
总结来说,Type-C接口虽然具有统一的物理外形和连接标准,但在具体实现上可能存在差异。这些差异包括功能差异、数据传输速度、充电功率、其他功能支持以及兼容性和标准等方面。因此,在使用Type-C接口时,需要了解设备和线缆的具体规格和支持情况,以确保其能够正常工作并发挥最佳性能。
现在的笔记本电脑主流接口是Type-C,用户常通过连接一个拓展坞(也称为扩展坞或接口转换器)来扩展其功能。这个拓展坞是一个适配器,它能够将单一的Type-C接口转换为多个其他类型的接口,如HDMI接口和USB Type-A接口,从而为用户提供了更多的连接选项和便利。
Type-C接口不仅支持传统的充电和数据传输功能,还支持反向供电。如连接到支持反向供电的显示器时,笔记本电脑可以通过Type-C接口从显示器获取电力,从而无需外接电源适配器即可工作。这种功能对于需要长时间移动办公或旅行的用户来说尤为方便。
2. 词语解释
题外话:最开始接触适配器模式时,对适配一词不太理解,慢慢的才对这个词有了认识。
想起以前读书时候专业课的学习,期末考试时候,专业课考卷上来就是词语解读。
这里我们也对"adapt", “adapter”,"适配"三个词进行解读下,以便我们更好的理解适配器模式。
-
Adapt(适应):这个词指的是使某物适应新的环境、条件或需求。在编程中,这通常意味着使一个组件或类能够与其他不兼容的组件或类一起工作。
“adapt”是一个英语单词,主要用作及物动词和不及物动词。
作为及物动词时,它的意思是“使适应;改编”。例如,“adapt oneself”表示“使自己适应…”,而“adapt something for”或“adapt something from”则表示“改编或改写某物以适应或来自…”。
作为不及物动词时,它的意思是“适应”。这通常指人或物在原有情况下作出某些改变,以适应新的环境或不同的条件。例如,“You have to adapt to the new job.”(你必须适应新工作。)
此外,“adapt”也可以用于描述生物体为适应环境变化而作出的改变,或者帮助生物体适应这些变化。
这里我们主要是认识到adapt有适应的意思。
何谓之适应?一定是环境与自己的预期不一致,因此才会有适应的概念。
正如同适配器模式的概念所述:
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
正因为提供的接口与我们期望(expect)的接口不一致,无法正常工作,于是通过适配器,进行适配,以适应这种不一致。 -
Adapter(适配器):这个词来源于“adapt”,指的是一个使不同设备或系统能够互相连接的装置或设备。在编程中,适配器是一个中间层或组件,它允许两个具有不兼容接口的类或组件协同工作。
-
适配(适配过程):这是一个过程,即将一个事物或系统调整或转换以适应另一个事物或系统的需求。在编程中,适配过程通常涉及将一个类的接口转换成另一个类所期望的接口。
3. 电源适配器
电脑等电子产品需要供电才能正常工作,而这些电子产品内部使用的电源通常是直流电(DC,Direct Current),这是因为电脑和其他电子设备的内部电路、电子元件和集成电路模块都是根据直流电的工作特性来设计和制造的。
然而,公共电网提供的交流电(AC,Alternating Current**)**,比如家庭用电通常是220V的交流电。
这种交流电通过电力设施进行传输和分配,最终供给我们日常使用的各种电器设备。
但是,这时就存在一个问题:如何将公共电网提供的交流电(AC)转换为电脑等电子产品所需的直流电(DC)呢?
直流电(DC)和交流电(AC)是电力系统中两种截然不同的电流格式。它们的主要区别体现在电流的方向和变化特性上。直流电的方向始终保持一致,不随时间变化,而交流电的方向则会随时间周期性改变。这两种电流格式在电力系统中各有其应用,根据具体需求和场景选择合适的电流格式是电力系统设计和运行的关键之一。
为了解决这个问题,人们发明了电源适配器(Power Adapter,也称为充电器Charger,还被称为外置电源)。电源适配器(Power Adapter)是一种电力转换设备,它能够将输入的交流电(AC)转换为所需的直流电(DC)。
这个转换过程通常包括以下几个步骤:
- 整流:电源适配器中的整流器将输入的交流电转换为脉动直流电。整流器通常使用二极管或晶体管等半导体器件来实现。
- 滤波:经过整流后的脉动直流电还含有一定的交流成分,需要通过滤波器进行平滑处理,以得到较为稳定的直流电。滤波器通常由电容器和电感器等元件组成。
- 稳压:为了确保输出的直流电具有稳定的电压值,电源适配器中还会包含稳压电路。稳压电路可以根据负载的变化,自动调整输出电压,以保持稳定。
经过以上步骤的转换后,公共电网提供的交流电就被成功地转换为了电脑等电子产品所需的直流电。
这样,我们就可以将电源适配器连接到电源插座上,为电脑等电子产品提供稳定的电力供应了。