feature: dyld && LD 链接器

This commit is contained in:
杭城小刘
2024-06-29 16:00:34 +08:00
parent 1a8659e143
commit 13f7457be9
367 changed files with 12893 additions and 3049 deletions

View File

@@ -1,14 +1,48 @@
# 适配器模式
主要用来解决:一个现有类需要适应变化的问题。
## 适配器模式的原理
适配器模式的英文翻译是 Adapter Design Pattern。顾名思义这个模式就是用来做适配的它将不兼容的接口转换为可兼容的接口让原本由于接口不兼容而不能一起工作的类可以一起工作。举个现实的例子USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作
## 适配器模式的实现
适配器模式有两种实现方式:
- 类适配器,使用继承关系来实现
- 对象适配器,对象适配器使用组合关系来实现
### 对象适配器
<img src="./../assets/ObjectAdapter.png" style="zoom:30%" />
假设一个类存在年代久远,如果需要适配,则需要创建一个适配对象。然后被适配的对象以成员变量的形式集成到适配对象中。
```
- (void)handleLogic {
// 适配逻辑
[被适配对象 对象方法];
// 适配逻辑
}
```
举个例子:
- ITarget 表示要转化成的接口定义
- Adaptee 是一组不兼容 ITarget 接口定义的接口
- Adaptor 将 Adaptee 转化成一组符合 ITarget 接口定义的接口
@@ -73,9 +107,12 @@ public class Adaptor implements ITarget {
适配器模式的应用场景是“接口不兼容”。那在实际的开发中,什么情况下才会出现接口不兼容呢?
### 封装有缺陷的接口设计
假设我们依赖的外部系统在接口设计方面有缺陷(比如包含大量静态方法),引入之后会影响到我们自身代码的可测试性。为了隔离设计上的缺陷,我们希望对外部系统提供的接口进行二次封装,抽象出更好的接口设计,这个时候就可以使用适配器模式了。
```
```java
public class CD { //这个类来自外部sdk我们无权修改它的代码
//...
public static void staticFunction1() { //... }
@@ -108,12 +145,15 @@ public class CDAdaptor extends CD implements ITarget {
}
}
```
### 统一多个类的接口设计
某个功能的实现依赖多个外部系统(或者说类)。通过适配器模式,将它们的接口适配为统一的接口定义,然后我们就可以使用多态的特性来复用代码逻辑。
假设我们的系统要对用户输入的文本内容做敏感词过滤,为了提高过滤的召回率,我们引入了多款第三方敏感词过滤系统,依次对用户输入的内容进行过滤,过滤掉尽可能多的敏感词。但是,每个系统提供的过滤接口都是不同的。这就意味着我们没法复用一套逻辑来调用各个系统。这个时候,我们就可以使用适配器模式,将所有系统的接口适配为统一的接口定义,这样我们可以复用调用敏感词过滤的代码。
```
```java
public class ASensitiveWordsFilter { // A敏感词过滤系统提供的接口
//text是原始文本函数输出用***替换敏感词之后的文本
public String filterSexyWords(String text) {
@@ -178,10 +218,13 @@ public class RiskManagement {
}
}
```
### 替换依赖的外部系统
当我们把项目中依赖的一个外部系统替换为另一个外部系统的时候,利用适配器模式,可以减少对代码的改动。
```
```java
// 外部系统A
public interface IA {
//...
@@ -218,17 +261,26 @@ public class BAdaptor implemnts IA {
Demo d = new Demo(new BAdaptor(new B()));
```
### 兼容老版本
在做版本升级的时候,对于一些要废弃的接口,我们不直接将其删除,而是暂时保留,并且标注为 deprecated并将内部实现逻辑委托为新的接口实现。这样做的好处是让使用它的项目有个过渡期而不是强制进行代码修改。这也可以粗略地看作适配器模式的一个应用场景
### 适配不同格式的数据
前面我们讲到适配器模式主要用于接口的适配实际上它还可以用在不同格式的数据之间的适配。比如把从不同征信系统拉取的不同格式的征信数据统一为相同的格式以方便存储和使用。再比如Java 中的 Arrays.asList() 也可以看作一种数据适配器,将数组类型的数据转化为集合容器类型。
```
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
```
## 代理、桥接、装饰器、适配器 4 种设计模式的区别
代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类
尽管代码结构相似,但这 4 种设计模式的用意完全不同,也就是说要解决的问题、应用场景不同,这也是它们的主要区别