JS設(shè)計(jì)模式---2.接口

什么是接口

接口提供了一種用以說(shuō)明一個(gè)對(duì)象應(yīng)該具有哪些方法的手段喊儡。

接口之利

  • 接口可以告訴一個(gè)程序員一個(gè)類實(shí)現(xiàn)了哪些方法挤渔,從而幫助其使用這個(gè)類阿逃。
  • 接口還有助于穩(wěn)定不同類之間的通信方式逸绎。

接口之弊

  • 接口的使用在一定程度上強(qiáng)化了類型的作用骡男,這降低了語(yǔ)言的靈活性淆游。
  • JS并沒(méi)有提供對(duì)接口的內(nèi)置支持,而試圖模仿其他語(yǔ)言的內(nèi)置功能總是會(huì)有一些風(fēng)險(xiǎn)
  • JS中任何實(shí)現(xiàn)接口的方法都會(huì)對(duì)性能造成一定影響隔盛,在某種程度上這得歸咎于額外的方法調(diào)用的開(kāi)銷
  • 接口的使用最大的問(wèn)題在于犹菱,無(wú)法強(qiáng)迫其他程序員遵守你定義的接口

模仿接口實(shí)現(xiàn)

  • 用注釋描述接口
/*
  interface Composite {
     function add(child);
     function remove(child);
     function getChild(child);
  }
   interface FormItem {
     function save(child);
  }
*/
var CompositeFrom = function(id,method,action){
   ...
};
CompositeFrom .prototype.add = function(child){
 ...
};
CompositeFrom .prototype.remove= function(child){
 ...
};
CompositeFrom .prototype.getChild= function(child){
 ...
};
CompositeFrom .prototype.save= function(child){
 ...
};

這種做法易于實(shí)現(xiàn),不需要額外的類或函數(shù)吮炕±巴眩可以提高代碼的可重用性。

它的缺點(diǎn)在于沒(méi)有為確保CompositeFrom真正實(shí)現(xiàn)了的正確方法而進(jìn)行檢查龙亲,也不會(huì)拋出錯(cuò)誤告訴程序員程序中有問(wèn)題陕凹,所以對(duì)于測(cè)試和調(diào)試也沒(méi)有什么幫助。

  • 屬性檢查模仿接口
/*
  interface Composite {
     function add(child);
     function remove(child);
     function getChild(child);
  }
   interface FormItem {
     function save(child);
  }
*/
var CompositeFrom = function(id,method,action){
  //定義一個(gè)數(shù)組  存放將要實(shí)現(xiàn)的接口
  this.implementsInterface = ['Composite','FormItem'];
  ...
};
function addForm(formInstance){
  // 調(diào)用檢查函數(shù) 如果存在未定義的接口 拋出錯(cuò)誤
  if(!implements(formInstance,'Composite','FormItem')){
    throw new Error('Object does not implement a required interface')
  }
  ...
}
function implements(object){
  for (var i = 1;i<argumements.length;i++){
    // 遍歷參數(shù)  跳過(guò)第一個(gè) 
    var interfaceName = argument[i]; //接口名稱
    var interfaceFound = false ; //flag
    for (var j=0;j<object.implementsInterface.length;j++){
      // 遍歷存放接口名稱的數(shù)組
      if(implementsInterface[j] == interfaceName){
        interfaceFound = true;
        break;
      }
    }
    //  如果找到返回true  否則返回false
    return interfaceFound 
  }
}

這種方法不僅對(duì)所實(shí)現(xiàn)的接口進(jìn)行了注釋說(shuō)明鳄炉,如果需要的接口不在一個(gè)類所宣稱支持接口之內(nèi)杜耙,它還會(huì)拋出一個(gè)錯(cuò)誤,這樣就可以強(qiáng)迫其它程序員聲明這些接口迎膜。

它的缺點(diǎn)在于你不能保證所聲明的接口是否真正實(shí)現(xiàn)泥技。所以會(huì)存在檢查通過(guò)浆兰,而方法不存在的問(wèn)題磕仅。

  • 鴨式辨型模仿接口
// Interface
var Composite = new Interface('Composite',['add','remove','getChild']);
var FormItem= new Interface('FormItem',['save']);
//CompositeForm 類
var CompositeForm= function(id,method,action){
 ...
};
functiom addForm(formIntance){
  // 輔助函數(shù)  如果引入未定義的接口會(huì)拋出錯(cuò)誤
  ensureImplements(formIntance,Composite,FormItem);
  ...
}

這種方法不依賴于注釋珊豹。其各個(gè)方面都是可以強(qiáng)制實(shí)施的。ensureImplements函數(shù)至少需要兩個(gè)參數(shù)榕订,第一個(gè)參數(shù)是想要檢查的對(duì)象店茶,其余參數(shù)是據(jù)以對(duì)那個(gè)對(duì)象進(jìn)行檢查的接口。

它的缺點(diǎn)在于劫恒,類并不聲明自己實(shí)現(xiàn)了哪些接口贩幻,降低了代碼的可重用性,也缺乏上面兩種方法的自我描述性两嘴。它依賴于輔助類Interface和輔助函數(shù)ensureImplements丛楚。

Interface類的實(shí)現(xiàn)

// 構(gòu)造函數(shù)

 var Interface = function(name,methods){
    if(arguments.length != 2){  
      throw new Error(`Interface constructor called with ${arguments.length} arguments, but expcted 2.`);
    }
    this.name = name;
    this.methods = [];
    for(var i =0;i<methods.length;i++){
      if(typeof methodsp[i] !== 'string'){
        throw new Error("Interface  constructor expects method name to be passed in as a string");
      } 
      this.methods.push(methods[i]);
    }
};
// 輔助函數(shù)
Interface.ensureImplements = function(object){
    //  如果參數(shù)小于2個(gè)拋出錯(cuò)誤
    if(arguments.length<2){
      throw new Error(`Function Interface.ensureImplements called with ${arguments.length} arguments, but expected at least 2.`);
    }
    for(var i = 1; i<arguments.length; i++){
      var interface = arguments[i];
      // 如果類的構(gòu)造函數(shù)不是Interface 拋出錯(cuò)誤
      if(interface.constructor !== Interface){
        throw new Error("Function Interface.ensureImplements expects arguments two and above to be insterface of Interface")
      }
       // 遍歷存放接口名稱的數(shù)組
      for (var j=0;j<interface.methods.length;j++){
        var method = interface.methods[j]
        if(!object[method] || typeof method !== 'function'){
          throw new Error(`Function Interface.ensureImplements: object does not implement the ${interface.name} interface.Method ${method} was not found`)
        }
      }
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市憔辫,隨后出現(xiàn)的幾起案子趣些,更是在濱河造成了極大的恐慌,老刑警劉巖贰您,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坏平,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锦亦,警方通過(guò)查閱死者的電腦和手機(jī)舶替,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杠园,“玉大人顾瞪,你說(shuō)我怎么就攤上這事∨滓希” “怎么了玲昧?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)篮绿。 經(jīng)常有香客問(wèn)我孵延,道長(zhǎng),這世上最難降的妖魔是什么亲配? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任尘应,我火速辦了婚禮,結(jié)果婚禮上吼虎,老公的妹妹穿的比我還像新娘犬钢。我一直安慰自己,他們只是感情好思灰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布玷犹。 她就那樣靜靜地躺著,像睡著了一般洒疚。 火紅的嫁衣襯著肌膚如雪歹颓。 梳的紋絲不亂的頭發(fā)上坯屿,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音巍扛,去河邊找鬼领跛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撤奸,可吹牛的內(nèi)容都是我干的吠昭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胧瓜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矢棚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起府喳,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幻妓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后劫拢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肉津,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年舱沧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妹沙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熟吏,死狀恐怖距糖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牵寺,我是刑警寧澤悍引,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帽氓,受9級(jí)特大地震影響趣斤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黎休,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一浓领、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧势腮,春花似錦联贩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春祸泪,著一層夾襖步出監(jiān)牢的瞬間吗浩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工浴滴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拓萌,地道東北人岁钓。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓升略,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屡限。 傳聞我的和親對(duì)象是個(gè)殘疾皇子品嚣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)钧大,斷路器翰撑,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,982評(píng)論 3 119
  • “南朝四百八十寺逝撬,多少樓臺(tái)煙雨中∨彝粒”這是晚唐時(shí)期的愛(ài)國(guó)詩(shī)人杜牧宪潮,借古諷今的名句。 我對(duì)宗教的發(fā)展史了解的并不精準(zhǔn)趣苏,...
    點(diǎn)墨聞香閱讀 315評(píng)論 0 1
  • 雜志簡(jiǎn)介 《名車志CAR AND DRIVER》的內(nèi)容資源得天獨(dú)厚狡相,它的母本《CAR AND DRIVER》在全世...
    12131_63a7閱讀 196評(píng)論 0 0
  • 昏燈下,躊躇書一紙食磕,筆轉(zhuǎn)三圈尽棕,紅豆發(fā)幾枝? 月明中彬伦,我盡將心所向萄金,但只輕怕,明月照溝渠媚朦。卻無(wú)畏氧敢,兩日昏黑。 ...
    思考的咯吱窩閱讀 160評(píng)論 0 2