一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
概念:
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
生活例子类比:
比如我们的笔记本电脑的额定工作电压是直流12伏特,想要电脑在交流100伏特的AC电源下工作,这个时候要怎么办呢?我们可以使用AC适配器,让他将家庭用的交流100v电压转换成我们所需要的直流12v电压。这个AC适配器就是适配器模式里的适配器。一般当我们的需求与实际请求相互不匹配的时候,就需要在这个适配器的出现,让他填补两者之间的差异。
优点:
使用适配器模式可以在完全不改变现有代码的前提下使用现有代码适配于新的接口。
缺点:
过多的使用适配器,会让系统非常零乱,不容易整体进行把握。
应用场景:
想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。
适配器模式中的不同角色:
适配器模式中有三种角色,实际情况,需求,以及适配器。当实际情况并不能与我们所要的需求所匹配时,就需要适配器的出现。
- 实际情况角色:Banner类,Print类。
- 需求角色:调用方,也就是开始调用那部分代码
- 适配器类:PrintBanner类。
示例代码:
Banner类:
class Banner {
constructor(string) {
this.string = string;
}
showWithParen() {
console.log(`(${this.string})`);
}
showWithAster() {
console.log(`*${this.string}*`);
}
}
class Print {
printWeak() {}
printStrong() {}
}
需求角色:
// 开始调用
const printBanner = new PrintBanner('999');
printBanner.printWeak();
printBanner.printStrong();
适配器:
- 类适配器模式:使用继承的适配器;
// 使用继承的适配器
class PrintBanner extends Banner {
constructor(string) {
super(string);
// this.string = string
}
printWeak() {
this.showWithParen();
}
printStrong() {
this.showWithAster();
}
}
- 对象适配器模式:使用委托的适配器;
class PrintBanner extends Print {
constructor(string) {
super();
this.banner = new Banner(string);
}
printWeak() {
this.banner.showWithParen();
}
printStrong() {
this.banner.showWithAster();
}
}