日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入理解JavaScript:設(shè)計模式之適配器模式

介  紹

創(chuàng)新互聯(lián)建站為您提適合企業(yè)的網(wǎng)站設(shè)計?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強(qiáng)的網(wǎng)絡(luò)競爭力!結(jié)合企業(yè)自身,進(jìn)行網(wǎng)站設(shè)計及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站制作、做網(wǎng)站, 我們的網(wǎng)頁設(shè)計師為您提供的解決方案。

適配器模式(Adapter)是將一個類(對象)的接口(方法或?qū)傩裕┺D(zhuǎn)化成客戶希望的另外一個接口(方法或?qū)傩裕?,適配器模式使得原本由于接口不兼容而不能一起工作的那些類(對象)可以一些工作。速成包裝器(wrapper)。

正  文

我們來舉一個例子,鴨子(Dock)有飛(fly)和嘎嘎叫(quack)的行為,而火雞雖然也有飛(fly)的行為,但是其叫聲是咯咯的(gobble)。如果你非要火雞也要實現(xiàn)嘎嘎叫(quack)這個動作,那我們可以復(fù)用鴨子的quack方法,但是具體的叫還應(yīng)該是咯咯的,此時,我們就可以創(chuàng)建一個火雞的適配器,以便讓火雞也支持quack方法,其內(nèi)部還是要調(diào)用gobble。

OK,我們開始一步一步實現(xiàn),首先要先定義鴨子和火雞的抽象行為,也就是各自的方法函數(shù):

 
 
 
  1. //鴨子  
  2. var Duck = function(){  
  3.  
  4. };  
  5. Duck.prototype.fly = function(){  
  6. throw new Error("該方法必須被重寫!");  
  7. };  
  8. Duck.prototype.quack = function(){  
  9. throw new Error("該方法必須被重寫!");  
  10. }  
  11.  
  12. //火雞  
  13. var Turkey = function(){  
  14.  
  15. };  
  16. Turkey.prototype.fly = function(){  
  17.     throw new Error(" 該方法必須被重寫 !");  
  18. };  
  19. Turkey.prototype.gobble = function(){  
  20.     throw new Error(" 該方法必須被重寫 !");  
  21. }; 

然后再定義具體的鴨子和火雞的構(gòu)造函數(shù),分別為:

 
 
 
  1. //鴨子  
  2. var MallardDuck = function () {  
  3.     Duck.apply(this);  
  4. };  
  5. MallardDuck.prototype = new Duck(); //原型是Duck  
  6. MallardDuck.prototype.fly = function () {  
  7.     console.log("可以飛翔很長的距離!");  
  8. };  
  9. MallardDuck.prototype.quack = function () {  
  10.     console.log("嘎嘎!嘎嘎!");  
  11. };  
  12.  
  13. //火雞  
  14. var WildTurkey = function () {  
  15.     Turkey.apply(this);  
  16. };  
  17. WildTurkey.prototype = new Turkey(); //原型是Turkey  
  18. WildTurkey.prototype.fly = function () {  
  19.     console.log("飛翔的距離貌似有點(diǎn)短!");  
  20. };  
  21. WildTurkey.prototype.gobble = function () {  
  22.     console.log("咯咯!咯咯!");  
  23. }; 

為了讓火雞也支持quack方法,我們創(chuàng)建了一個新的火雞適配器TurkeyAdapter:

 
 
 
  1. var TurkeyAdapter = function(oTurkey){  
  2.     Duck.apply(this);  
  3.     this.oTurkey = oTurkey;  
  4. };  
  5. TurkeyAdapter.prototype = new Duck();  
  6. TurkeyAdapter.prototype.quack = function(){  
  7.     this.oTurkey.gobble();  
  8. };  
  9. TurkeyAdapter.prototype.fly = function(){  
  10.     var nFly = 0;  
  11.     var nLenFly = 5;  
  12.     for(; nFly < nLenFly;){  
  13.         this.oTurkey.fly();  
  14.         nFly = nFly + 1;  
  15.     }  
  16. }; 

該構(gòu)造函數(shù)接受一個火雞的實例對象,然后使用Duck進(jìn)行apply,其適配器原型是Duck,然后要重新修改其原型的quack方法,以便內(nèi)部調(diào)用oTurkey.gobble()方法。其fly方法也做了一些改變,讓火雞連續(xù)飛5次(內(nèi)部也是調(diào)用自身的oTurkey.fly()方法)。

調(diào)用方法,就很明了了,測試一下便可以知道結(jié)果了:

 
 
 
  1. var oMallardDuck = new MallardDuck();  
  2. var oWildTurkey = new WildTurkey();  
  3. var oTurkeyAdapter = new TurkeyAdapter(oWildTurkey);  
  4.  
  5. //原有的鴨子行為  
  6. oMallardDuck.fly();  
  7. oMallardDuck.quack();  
  8.  
  9. //原有的火雞行為  
  10. oWildTurkey.fly();  
  11. oWildTurkey.gobble();  
  12.  
  13. //適配器火雞的行為(火雞調(diào)用鴨子的方法名稱)  
  14. oTurkeyAdapter.fly();  
  15. oTurkeyAdapter.quack(); 

總  結(jié)

那合適使用適配器模式好呢?如果有以下情況出現(xiàn)時,建議使用:

  1. 使用一個已經(jīng)存在的對象,但其方法或?qū)傩越涌诓环夏愕囊螅?/li>
  2. 你想創(chuàng)建一個可復(fù)用的對象,該對象可以與其它不相關(guān)的對象或不可見對象(即接口方法或?qū)傩圆患嫒莸膶ο螅﹨f(xié)同工作;
  3. 想使用已經(jīng)存在的對象,但是不能對每一個都進(jìn)行原型繼承以匹配它的接口。對象適配器可以適配它的父對象接口方法或?qū)傩浴?/li>

另外,適配器模式和其它幾個模式可能容易讓人迷惑,這里說一下大概的區(qū)別:

  1. 適配器和橋接模式雖然類似,但橋接的出發(fā)點(diǎn)不同,橋接的目的是將接口部分和實現(xiàn)部分分離,從而對他們可以更為容易也相對獨(dú)立的加以改變。而適配器則意味著改變一個已有對象的接口。
  2. 裝飾者模式增強(qiáng)了其它對象的功能而同時又不改變它的接口,因此它對應(yīng)程序的透明性比適配器要好,其結(jié)果是裝飾者支持遞歸組合,而純粹使用適配器則是不可能的。
  3. 代理模式在不改變它的接口的條件下,為另外一個對象定義了一個代理。

本文題目:深入理解JavaScript:設(shè)計模式之適配器模式
標(biāo)題鏈接:http://www.dlmjj.cn/article/djjcscj.html