最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript適配器模式詳解

 更新時間:2017年10月19日 16:36:24   作者:與你在巔峰相會  
這篇文章主要為大家詳細介紹了JavaScript適配器模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

適配模式可用來在現(xiàn)有接口和不兼容的類之間進行適配,使用這種模式的對象又叫包裝器(wrapper),因為它們是在用一個新的接口包裝另一個對象。

基本理論

適配器模式:將一個接口轉換成客戶端需要的接口而不需要去修改客戶端代碼,使得不兼容的代碼可以一起工作。
適配器主要有3個角色組成:

(1)客戶端:調用接口的類
(2)適配器:用來連接客戶端接口和提供服務的接口的類
(3)適配者:提供服務,但是卻與客戶端接口需求不兼容服務類。

此處 有一個實例是關于兩個數(shù)的加法的。

一、先有一個能夠實現(xiàn),兩個數(shù)加法的服務和客戶端。

(1)先引入接口檢驗類----檢查實現(xiàn)該接口的類是否實現(xiàn)了接口中所用方法。

//(定義一個靜態(tài)方法來實現(xiàn)接口與實現(xiàn)類的直接檢驗
//靜態(tài)方法不要寫出Interface.prototype ,因為這是寫到接口的原型鏈上的
//我們要把靜態(tài)的函數(shù)直接寫到類層次上
//定義一個接口類
var Interface=function (name,methods) {//name:接口名字
  if(arguments.length<2){
    alert("必須是兩個參數(shù)")
  }
  this.name=name;
  this.methods=[];//定義一個空數(shù)組裝載函數(shù)名
  for(var i=0;i<methods.length;i++){
    if(typeof methods[i]!="string"){
      alert("函數(shù)名必須是字符串類型");
    }else {
      this.methods.push( methods[i]);
    }
  }
};
Interface.ensureImplement=function (object) {
  if(arguments.length<2){
    throw new Error("參數(shù)必須不少于2個")
    return false;
  }
  for(var i=1;i<arguments.length;i++){
    var inter=arguments[i];
    //如果是接口就必須是Interface類型
    if(inter.constructor!=Interface){
      throw new Error("如果是接口類的話,就必須是Interface類型");
    }
    //判斷接口中的方法是否全部實現(xiàn)
    //遍歷函數(shù)集合
    for(var j=0;j<inter.methods.length;j++){
      var method=inter.methods[j];//接口中所有函數(shù)

      //object[method]傳入的函數(shù)
      //最終是判斷傳入的函數(shù)是否與接口中所用函數(shù)匹配
      if(!object[method]||typeof object[method]!="function" ){//實現(xiàn)類中必須有方法名字與接口中所用方法名相同
        throw new Error("實現(xiàn)類中沒有完全實現(xiàn)接口中的所有方法")
      }
    }
  }
}

(2)使用接口類同一接口

 var InterfaceResult=new Interface("InterfaceResult",["add"]);

  (3)服務端兩個數(shù)的加法

function First() {
    this.add=function (x,y) {
     return x+y;
    }
    Interface.ensureImplement(this,InterfaceResult);//接口檢驗
  }

(4)客戶端調用服務端代碼

var first=new First();
  alert(first.add(1,2)) ;//3

二、現(xiàn)在有一個要求就是,需要換一個類庫,但是客戶端的程序不希望有大的改動。

(1)依然繼承相同接口的基礎上,類庫為

function Second() {
    this.add=function (numberList) {
      //[1,2,3] "1+2+3" eval("1+2+3")
      return eval(numberList.join("+"));
    }
    Interface.ensureImplement(this,InterfaceResult);//檢驗當前類是否完全實現(xiàn)接口中的方法
  }

此時我們如果需要使用該類庫的話,客戶端又不能該,那么用和之前的調用方式:

var second=new Second();
alert(second.add(1,3));//已經不能這樣使用了

是完全不符合客戶端的要求的。為了在保證客戶端不變的情況下,又能使用新的類庫,我們需要使用適配器模式?,F(xiàn)在接口發(fā)生了變化,使用適配器兼容,以便適應客戶端的不變。

使客戶端與新的接口相會兼容。

(2)適配器

 function ThirdWarpper() {
       this.add=function (x,y) {
         var arr=new Array();
         arr.push(x);
         arr.push(y);
         return new Second().add(arr);
       }
       Interface.ensureImplement(this,InterfaceResult);
     }

(3)客戶端代碼

//客戶端
  var third=new ThirdWarpper();
  var result= third.add(1,8);//傳遞數(shù)
  alert(result);

針對上述的使用新的類庫后的圖解為:


總結

從表面上看,適配器模式很像外觀模式。它們都要對別的對象進行包裝并改變其呈現(xiàn)的接口。二者的差別在于它們如何改變接口。外觀元素展現(xiàn)的是一個簡化的接口,它并不提供額外的選擇,而且有時為了方便完成常見任務它還會做出一些假定。而適配器則要把一個接口轉換為另一個接口,它并不會濾除某些能力,也不會簡化接口。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

株洲市| 桐庐县| 天峨县| 翁牛特旗| 商都县| 金堂县| 河东区| 孟州市| 泾川县| 瓦房店市| 汶上县| 洱源县| 府谷县| 阿合奇县| 宣城市| 泰安市| 当涂县| 岳西县| 宝清县| 普宁市| 绥宁县| 黎川县| 永嘉县| 科技| 凉城县| 蒲城县| 台东县| 张北县| 大庆市| 印江| 龙陵县| 浦北县| 北宁市| 福贡县| 易门县| 汕尾市| 湘阴县| 阳曲县| 涟水县| 广灵县| 德安县|