<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

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

      2012-04-11 09:16  湯姆大叔  閱讀(15303)  評論(19)    收藏  舉報

      介紹

      適配器模式(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. 代理模式在不改變它的接口的條件下,為另外一個對象定義了一個代理。

      參考:https://github.com/tcorral/Design-Patterns-in-Javascript/blob/master/Adapter/index.html

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 国产午夜福利精品视频| 囯产精品久久久久久久久久妞妞| 日韩国产中文字幕精品| 亚洲人成小说网站色在线 | 亚洲欧美自偷自拍视频图片| 长乐市| 国产精品成熟老女人| 99久久婷婷国产综合精品青草漫画| 成人国产精品一区二区不卡| 人妻丝袜无码专区视频网站| 日韩精品国产二区三区| 91亚洲精品一区二区三区| 国产精品+日韩精品+在线播放| 成人免费A级毛片无码片2022| 国产成人免费午夜在线观看| 夜夜高潮次次欢爽av女| 99精品热在线在线观看视| 国产99久久精品一区二区| 亚洲性日韩精品一区二区三区| 乳山市| 国产精品成人免费视频网站京东| 国产美女自慰在线观看| 日本免费一区二区三区日本| 麻豆精产国品一二三产| 亚洲嫩模一区二区三区| 四虎网址| 国产另类ts人妖一区二区| 福利一区二区在线视频| 亚洲乱熟乱熟女一区二区| 久久这里精品国产99丫E6| 日本亲近相奷中文字幕| 午夜福利日本一区二区无码| 国产欲女高潮正在播放| 亚洲中文精品一区二区| 日韩在线观看精品亚洲| 亚洲日韩AV秘 无码一区二区| 在线播放深夜精品三级| 精品黄色av一区二区三区| 国产资源精品中文字幕| 中国女人高潮hd| 激情综合网激情综合网五月|