持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天
介绍
适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
使用场景
-
有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
-
装饰者模式和代理模式也不会改变原有对象的接口,但装饰者模式的作用是为了给对象
增加功能。装饰者模式常常形成一条长的装饰链,而适配器模式通常只包装一次。代理
模式是为了控制对对象的访问,通常也只包装一次。
-
适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实
现的,也不考虑它们将来可能会如何演化。
应用实践
职责明确
- 客户端:主要包含当前程序的业务逻辑的类
- 客户端接口:描述了其他类与客户端代码合作时必须的协议
- 被适配者:包含一些功能的类,客户端与其接口不兼容,因为无法直接调用其功能
- 适配器:可以同时与客户端和服务交互的类,适配器接收客户端通过适配器接口发起的调用,并将其转换为适用于封装被适配者对象的调用
实现
interface Source {
request(): void;
}
//Adaptee(被适配者)
class Adaptee {
public selfRequest(): void {
console.log("selfRequest of Adaptee");
}
}
//适配器
class Adapter implements Source {
public request(): void {
var adaptee: Adaptee = new Adaptee();
adaptee.selfRequest();
}
}
//调用
const adapter: Adapter = new Adapter();
adapter.request();
汇总
在项目开发过程中减少继承关系这是一个很不错的编程习惯。适配器模式通过封装对象将复杂的转换过程隐藏在其他类中,被封装的对象是甚至完全察觉不到适配器的存在。例如你可以使用一个将所有数据转换为英制单位(如英尺和英里) 的适配器封装运行于米和千米单位制中的对象。
优点特性
- 适配器模式是完全符合单一职责,可以将接口或数据转换代码从程序主要业务逻辑中分离
- 客户端代码通过客户端接口与适配器进行交互,你就能在不修改原有客户端代码的情况下在程序中添加新类型的适配器
- 提高类的复用性,源角色在原有系统中还可以正常使用
缺点弊端
- 代码整体复杂度增加,因为需要新增一些列接口和类。有时直接更改服务类使其与其他代码兼容会更简单
- 由于类不支持多继承一次只能适配一个适配者类,而且目标抽象只能为接口,有一定的局限性
- 被适配者的方法在
Adapter中都会暴漏出来 - 对象适配器与类适配器相比,想要置换被适配者类的方法不容易实现