持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
关键词:结构型 适配器模式 adapter 事后设计
解决什么问题?
适配器模式是一种结构型设计模式。
使用目的是解决两个组件间的接口不兼容的问题。通常在已有程序中使用, 让相互不兼容的类能很好地合作。 其实是用来弥补系统设计缺陷的一种设计。(亡羊补牢
典型的应用场景是:后端返回的数据结构和表单组件需要的数据结构不一致。
遇到这种情况,我们有两种处理方法:
- 找后端修改返回字段和结构
- 获取数据之后前端做一层适配,自行处理。
如果结论是后者,这时候我们就可以使用双向适配器来兼容两者。
如何实现
/**
* Adaptee => Target 报错
* Adaptee => Adapter => Target 成功
*/
class Target {
public request(): string {
return '目标行为';
}
}
class Adaptee {
public specificRequest(): string {
return '为行殊特eetpadA';
}
}
class Adapter extends Target {
private adaptee: Adaptee;
constructor(adaptee: Adaptee) {
super();
this.adaptee = adaptee;
}
public request(): string {
const result = this.adaptee.specificRequest().split('').reverse().join('');
return `适配器转换${result}`;
}
}
测试代码
function clientCode(target: Target) {
console.log(target.request());
}
// 直接执行 target
const target = new Target();
clientCode(target);
// 直接执行 adaptee
const adaptee = new Adaptee();
console.log(`Adaptee: ${adaptee.specificRequest()}`);
//通过是配置执行 adaptee
const adapter = new Adapter(adaptee);
clientCode(adapter);
与其他设计模式的区别
| 代理模式 | 桥接模式 | 装饰器模式 | 适配器模式 |
|---|---|---|---|
| 事后设计 | 事前设计 | 事后设计 | 事后设计 |
| 不改变原始类接口,提供跟原始类相同的接口 | 写代码之前就要把接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。 | 不改变原始类接口,提供跟原始类相同的接口, | 提供跟原始类不同的接口。 |
| 为原始类定义一个代理类,主要目的是控制访问,而非加强功能。 | 加强原始类功能,支持多个装饰器的嵌套使用。 |