亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript系列(39):設計模式之適配器模式詳解

2024-05-06 16:15:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了深入理解JavaScript系列(39):設計模式之適配器模式詳解,適配器模式(Adapter)是將一個類(對象)的接口(方法或屬性)轉化成客戶希望的另外一個接口(方法或屬性),需要的朋友可以參考下
 

介紹

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

正文

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

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

復制代碼代碼如下:

//鴨子
var Duck = function(){

 

};
Duck.prototype.fly = function(){
throw new Error("該方法必須被重寫!");
};
Duck.prototype.quack = function(){
throw new Error("該方法必須被重寫!");
}

//火雞
var Turkey = function(){

};
Turkey.prototype.fly = function(){
    throw new Error(" 該方法必須被重寫 !");
};
Turkey.prototype.gobble = function(){
    throw new Error(" 該方法必須被重寫 !");
};


然后再定義具體的鴨子和火雞的構造函數,分別為:
復制代碼代碼如下:

//鴨子
var MallardDuck = function () {
    Duck.apply(this);
};
MallardDuck.prototype = new Duck(); //原型是Duck
MallardDuck.prototype.fly = function () {
    console.log("可以飛翔很長的距離!");
};
MallardDuck.prototype.quack = function () {
    console.log("嘎嘎!嘎嘎!");
};

 

//火雞
var WildTurkey = function () {
    Turkey.apply(this);
};
WildTurkey.prototype = new Turkey(); //原型是Turkey
WildTurkey.prototype.fly = function () {
    console.log("飛翔的距離貌似有點短!");
};
WildTurkey.prototype.gobble = function () {
    console.log("咯咯!咯咯!");
};


為了讓火雞也支持quack方法,我們創建了一個新的火雞適配器TurkeyAdapter:
復制代碼代碼如下:

var TurkeyAdapter = function(oTurkey){
    Duck.apply(this);
    this.oTurkey = oTurkey;
};
TurkeyAdapter.prototype = new Duck();
TurkeyAdapter.prototype.quack = function(){
    this.oTurkey.gobble();
};
TurkeyAdapter.prototype.fly = function(){
    var nFly = 0;
    var nLenFly = 5;
    for(; nFly < nLenFly;){
        this.oTurkey.fly();
        nFly = nFly + 1;
    }
};

 

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

調用方法,就很明了了,測試一下便可以知道結果了:

復制代碼代碼如下:

var oMallardDuck = new MallardDuck();
var oWildTurkey = new WildTurkey();
var oTurkeyAdapter = new TurkeyAdapter(oWildTurkey);

 

//原有的鴨子行為
oMallardDuck.fly();
oMallardDuck.quack();

//原有的火雞行為
oWildTurkey.fly();
oWildTurkey.gobble();

//適配器火雞的行為(火雞調用鴨子的方法名稱)
oTurkeyAdapter.fly();
oTurkeyAdapter.quack();

 

總結

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

1.使用一個已經存在的對象,但其方法或屬性接口不符合你的要求;
2.你想創建一個可復用的對象,該對象可以與其它不相關的對象或不可見對象(即接口方法或屬性不兼容的對象)協同工作;
3.想使用已經存在的對象,但是不能對每一個都進行原型繼承以匹配它的接口。對象適配器可以適配它的父對象接口方法或屬性。

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕久精品免费视频| 97成人精品区在线播放| 久久亚洲精品小早川怜子66| 久久久亚洲精选| 国产精品视频色| 综合久久五月天| 久久久久久久激情视频| 中文字幕少妇一区二区三区| 亚洲福利视频免费观看| 亚洲成色777777女色窝| 精品国产电影一区| 91免费看国产| 久久久国产精品亚洲一区| 欧美成人精品一区| 91视频88av| 国产精品美女www爽爽爽视频| 精品在线小视频| 亚洲第一av网站| 九九热r在线视频精品| 国产精品亚洲第一区| 亚洲无限av看| 久久躁狠狠躁夜夜爽| 岛国av午夜精品| 国产不卡一区二区在线播放| 欧美精品一区二区三区国产精品| 91免费电影网站| 国产精品高清网站| 午夜精品福利电影| 欧美亚洲成人精品| 欧美丝袜第一区| 日本a级片电影一区二区| 日韩精品免费看| 国产97色在线| 91精品国产91久久| 国产精品嫩草视频| 亚洲图片在区色| 久久精品国产96久久久香蕉| 蜜臀久久99精品久久久久久宅男| 欧美黑人性猛交| 91精品国产沙发| 亚洲激情在线观看| 国内精品久久影院| 黑人巨大精品欧美一区免费视频| 人妖精品videosex性欧美| 国产精品一区二区久久久| 亚洲天堂一区二区三区| 91久久精品在线| 久久99精品久久久久久青青91| 亚洲第一视频在线观看| 久久久人成影片一区二区三区| 九九热这里只有在线精品视| 欧美日韩国产黄| 亚洲电影在线观看| 91久久精品一区| 久久亚洲一区二区三区四区五区高| 97色在线视频观看| 国产精品久久久久久久久久三级| 国产精品久久97| 亚洲自拍另类欧美丝袜| 国产亚洲欧洲黄色| 奇米四色中文综合久久| 亚洲男人第一av网站| 日韩高清免费观看| 日韩一区二区福利| 亚洲欧美日本另类| 少妇高潮久久久久久潘金莲| 91久久精品日日躁夜夜躁国产| 亚洲va欧美va国产综合剧情| 日韩欧美aⅴ综合网站发布| 在线成人一区二区| 一区二区成人精品| 欧美精品电影免费在线观看| 亚洲人成网7777777国产| 日韩电影中文字幕av| 国产精品三级美女白浆呻吟| 久久精品视频播放| 亚洲黄一区二区| 亚洲性线免费观看视频成熟| 欧美在线视频观看免费网站| 亚洲大胆人体视频| 98视频在线噜噜噜国产| 成人激情电影一区二区| 欧美性猛交xxxx黑人| 久久精彩免费视频| 九九热这里只有精品免费看| 美女啪啪无遮挡免费久久网站| 欧美劲爆第一页| 亚洲福利视频网| 国产免费亚洲高清| 亚洲 日韩 国产第一| 日韩中文字幕在线观看| 久久精品亚洲一区| 亚洲视频欧洲视频| 欧美成人精品三级在线观看| 成人h猎奇视频网站| 国产日本欧美视频| 亚洲欧美日韩爽爽影院| 欧美性猛交xxxx乱大交极品| 国产精国产精品| 91手机视频在线观看| 久久中文字幕在线视频| www.午夜精品| 欧美国产日韩xxxxx| 亚洲高清久久久久久| 97高清免费视频| 日韩精品中文字幕在线播放| 亚洲国产成人一区| 欧美综合国产精品久久丁香| 欧美高清性猛交| 亚洲自拍偷拍第一页| 国产精品免费网站| 欧美在线观看网站| 亚洲国产高潮在线观看| 亚洲色图国产精品| 午夜精品一区二区三区在线视频| 91av视频在线播放| 色噜噜狠狠色综合网图区| 亚洲网站在线观看| 成人免费观看49www在线观看| 日韩欧美一区二区三区| 欧美午夜美女看片| 国产成人午夜视频网址| 成人激情综合网| 亚洲国产成人91精品| 欧美成人激情视频| 亚洲精品不卡在线| 亚洲男人av电影| 欧美激情视频一区二区三区不卡| 久久97精品久久久久久久不卡| 91免费电影网站| 全亚洲最色的网站在线观看| 精品福利视频导航| 国产色婷婷国产综合在线理论片a| 久久久噜噜噜久久久| 精品香蕉一区二区三区| yw.139尤物在线精品视频| 国产日韩欧美影视| 日韩高清人体午夜| 国产一区二区成人| 2019最新中文字幕| 欧美黄色性视频| 国产日韩欧美日韩| 这里只有精品久久| 欧美激情一级精品国产| 中文字幕日韩在线观看| 国产精品专区第二| 亚洲人午夜色婷婷| 亚洲成年网站在线观看| 国产在线观看不卡| 成人国产精品日本在线| 成人中心免费视频| 久久国产视频网站| 欧美激情视频网| 亚洲精品一区中文字幕乱码| 日本高清不卡在线| 亚洲精品视频网上网址在线观看| 国产精品永久免费在线| 精品日韩视频在线观看| 国产亚洲美女精品久久久| 国产一区二区三区日韩欧美| 欧美性猛xxx| 亚洲天堂精品在线| 国产精品综合网站| 欧美性xxxxx极品|