Adapter,將一個類(對象)的接口(方法或者屬性)轉化爲另一個接口,以滿足用戶需求,使類(對象)之間接口的不兼容問題通過適配器得以解決
適用場景
- 1、使用一個已經存在的對象,但其方法或屬性接口不符合你的要求;
- 2、你想創建一個可複用的對象,該對象可以與其它不相關的對象或不可見對象(即接口方法或屬性不兼容的對象)協同工作;
- 3、想使用已經存在的對象,但是不能對每一個都進行原型繼承以匹配它的接口。對象適配器可以適配它的父對象接口方法或屬性。
示例
我們想讓Duck 和Turkey 的方法接口一致方便新功能使用,由於是老的代碼我們不清楚直接修改是否會造成老代碼無法使用,於是我們通過TurkeyAdapter做兼容
Class Duck {
fly () {
}
quack () {
}
}
Class Turkey {
fly () {
}
gobble () {
}
}
// 適配器
Class TurkeyAdapter {
constructor (turkey) {
this.turkey = turkey
}
fly () {
this.turkey.fly()
}
quack () { // 原本只有gobble 方法,通過適配器改造爲quack方法
this.turkey.gobble()
}
}
var duck = new Duck();
var turkey = new Turkey();
var turkeyAdapter = new TurkeyAdapter(turkey);
//原有的鴨子行爲
duck.fly();
duck.quack();
//原有的火雞行爲
turkey.fly();
turkey.gobble();
//適配器火雞的行爲(火雞調用鴨子的方法名稱)
turkeyAdapter.fly();
turkeyAdapter.quack();
適配器模式也經常用於日常的數據處理上,比如把一個有序的數組轉化成我們需要的對象格式:
const arr = ['Javascript', 'book', '前端編程語言', '8月1日']
function arr2objAdapter(arr) { // 轉化成我們需要的數據結構
return {
name: arr[0],
type: arr[1],
title: arr[2],
time: arr[3]
}
}
const adapterData = arr2objAdapter(arr)