JavaScript設(shè)計(jì)模式——適配器模式

適配器模式是設(shè)計(jì)模式行為型模式中的一種模式涣旨;

定義:

適配器用來(lái)解決兩個(gè)已有接口之間不匹配的問(wèn)題,它并不需要考慮接口是如何實(shí)現(xiàn)股冗,也不用考慮將來(lái)該如何修改霹陡;適配器不需要修改已有接口,就可以使他們協(xié)同工作止状;

白話解釋:
  你買了某種電器產(chǎn)品烹棉,準(zhǔn)備帶回家好好感受該款產(chǎn)品的魅力;結(jié)果帶回家之后準(zhǔn)備通電使用的時(shí)候导俘,發(fā)現(xiàn)該產(chǎn)品僅支持兩孔插座峦耘,而你家里的電源插座都是三孔插座;這個(gè)時(shí)候你總不能又跑去電器專賣店退貨吧旅薄;突然靈機(jī)一動(dòng)辅髓,你想起來(lái)了家里還有多功能電源插座,而多功能店員插座恰好就是三孔少梁,于是你拿出你的多功能電源插座插上電源插座洛口,再拿你電器產(chǎn)品的電源插座插在多功能插座上面的兩孔插座上,開(kāi)始享受美滋滋的生活凯沪;這里的多功能插座就是一個(gè)適配器第焰;

代碼實(shí)現(xiàn):

var googleMap = {
    show: function(){
        console.log( '開(kāi)始渲染谷歌地圖' );
    }
};
var baiduMap = {
    show: function(){
        console.log( '開(kāi)始渲染百度地圖' );
    }
};
var renderMap = function( map ){
    if ( map.show instanceof Function ){
        map.show();
    }
};

renderMap( googleMap ); // 開(kāi)始渲染谷歌地圖
renderMap( baiduMap ); // 開(kāi)始渲染百度地圖

當(dāng)然上面的代碼是能夠正常運(yùn)行的,這得益于這兩個(gè)對(duì)象中的參數(shù)名都是一樣的妨马,所以才能夠正常的運(yùn)行和顯示挺举;

var googleMap = {
    show: function(){
        console.log( '開(kāi)始渲染谷歌地圖' );
    }
};
var baiduMap = {
    display: function(){
        console.log( '開(kāi)始渲染百度地圖' );
    }
};

突然有一天如果baiduMap的方法名改變了呢杀赢?那么我們?cè)俑厦嬉粯舆\(yùn)行肯定是回會(huì)報(bào)錯(cuò)的,因?yàn)閎aiduMap對(duì)象中已經(jīng)沒(méi)有了show()這個(gè)方法了湘纵;

使用適配器模式來(lái)修改:

var googleMap = {
    show: function(){
        console.log( '開(kāi)始渲染谷歌地圖' );
    }
};
var baiduMap = {
    display: function(){
        console.log( '開(kāi)始渲染百度地圖' );
    }
};
var baiduMapAdapter = {
    show: function(){
        return baiduMap.display();

    }
};

renderMap( googleMap ); // 輸出:開(kāi)始渲染谷歌地圖
renderMap( baiduMapAdapter ); // 輸出:開(kāi)始渲染百度地圖

在這段代碼中適配器做的事情其實(shí)很簡(jiǎn)單脂崔,就是創(chuàng)建了一個(gè)對(duì)象,添加了一個(gè)同名的show()方法梧喷,然后在適配器里面調(diào)用了baiduMap.display()方法砌左,這樣我們只需要在調(diào)用baiduMap的時(shí)候調(diào)用我們的適配器即可達(dá)到預(yù)期效果;

我們作為前端開(kāi)發(fā)人員铺敌,對(duì)頁(yè)面上期待得到的數(shù)據(jù)和數(shù)據(jù)格式肯定是比較了解的汇歹,但是在前后端分離的開(kāi)發(fā)模式中有的時(shí)候會(huì)遇到這種尷尬的處境:

我們都知道很多UI組件或者工具庫(kù)會(huì)按指定的數(shù)據(jù)格式進(jìn)行渲染,但是這個(gè)時(shí)候后端是不知道的偿凭;所以可能接口出來(lái)的數(shù)據(jù)我們是不能直接正常的在頁(yè)面上渲染的产弹,而此時(shí)老板催促我們趕緊上線,而后端堅(jiān)持認(rèn)為數(shù)據(jù)格式?jīng)]問(wèn)題弯囊,堅(jiān)決不修改取视;這個(gè)時(shí)候我們可以通過(guò)適配器模式來(lái)前端格式化數(shù)據(jù);

后端返回的json數(shù)據(jù)格式:

[
  {
    "day": "周一",
    "uv": 6300
  },
  {
    "day": "周二",
    "uv": 7100
  },  {
    "day": "周三",
    "uv": 4300
  },  {
    "day": "周四",
    "uv": 3300
  },  {
    "day": "周五",
    "uv": 8300
  },  {
    "day": "周六",
    "uv": 9300
  }, {
    "day": "周日",
    "uv": 11300
  }
]

Echarts圖表圖形需要的數(shù)據(jù)格式:

["周二", "周二", "周三"常挚, "周四", "周五"稽物, "周六"奄毡, "周日"] //x軸的數(shù)據(jù)

[6300. 7100, 4300, 3300, 8300, 9300, 11300] //坐標(biāo)點(diǎn)的數(shù)據(jù)

雖然心里苦,但還是要解決問(wèn)題贝或!使用適配器來(lái)解決:

//x軸適配器
function echartXAxisAdapter(res) {
  return res.map(item => item.day);
}

//坐標(biāo)點(diǎn)適配器
function echartDataAdapter(res) {
  return res.map(item => item.uv);
}

創(chuàng)建兩個(gè)函數(shù)分別對(duì)數(shù)據(jù)按照echarts所需要的數(shù)據(jù)格式進(jìn)行格式化處理即可解決問(wèn)題吼过;這兩個(gè)方法其實(shí)就是一個(gè)適配器,把指定的數(shù)據(jù)丟進(jìn)去即可按照指定規(guī)則輸出我們期待得到的數(shù)據(jù)格式咪奖;

總結(jié):
   個(gè)人認(rèn)為適配器模式其實(shí)是一種亡羊補(bǔ)牢式的設(shè)計(jì)模式盗忱,如果在項(xiàng)目開(kāi)發(fā)的開(kāi)始階段我們就知道我們期待的數(shù)據(jù)格式或者方法名等,我們就可能永遠(yuǎn)都用不到適配器模式羊赵;但是項(xiàng)目的迭代往往是不可預(yù)期的趟佃,當(dāng)項(xiàng)目迭代之后數(shù)據(jù)格式或者方法名發(fā)生變化之后,我們通趁两荩可以使用適配器模式來(lái)進(jìn)行適配解決闲昭;當(dāng)然了,最好的解決辦法就是項(xiàng)目開(kāi)發(fā)過(guò)程中前后端協(xié)商討論數(shù)據(jù)格式靡挥、文件名等代碼規(guī)范序矩,這樣是對(duì)項(xiàng)目的開(kāi)發(fā)效率是會(huì)有很大的提升的;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跋破,一起剝皮案震驚了整個(gè)濱河市簸淀,隨后出現(xiàn)的幾起案子瓶蝴,更是在濱河造成了極大的恐慌,老刑警劉巖租幕,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷手,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡令蛉,警方通過(guò)查閱死者的電腦和手機(jī)聚霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珠叔,“玉大人蝎宇,你說(shuō)我怎么就攤上這事〉话玻” “怎么了姥芥?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汇鞭。 經(jīng)常有香客問(wèn)我凉唐,道長(zhǎng),這世上最難降的妖魔是什么霍骄? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任台囱,我火速辦了婚禮,結(jié)果婚禮上读整,老公的妹妹穿的比我還像新娘簿训。我一直安慰自己,他們只是感情好米间,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布强品。 她就那樣靜靜地躺著,像睡著了一般屈糊。 火紅的嫁衣襯著肌膚如雪的榛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天逻锐,我揣著相機(jī)與錄音夫晌,去河邊找鬼。 笑死昧诱,一個(gè)胖子當(dāng)著我的面吹牛慷丽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳄哭,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼要糊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锄俄,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤局劲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奶赠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鱼填,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年毅戈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苹丸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苇经,死狀恐怖赘理,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扇单,我是刑警寧澤商模,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蜘澜,受9級(jí)特大地震影響施流,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鄙信,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一瞪醋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧装诡,春花似錦趟章、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宏侍。三九已至赖淤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谅河,已是汗流浹背咱旱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绷耍,地道東北人吐限。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像褂始,于是被迫代替她去往敵國(guó)和親诸典。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容