成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Javascript 設(shè)計(jì)模式讀書筆記(一)——接口

zhunjiee / 2679人閱讀

摘要:具體檢查方式則是檢查對(duì)象是否實(shí)現(xiàn)了接口所聲明的所有方法。組合模式將對(duì)象群體與組成對(duì)象同等對(duì)待。裝飾者模式透明地為另一對(duì)象提供包裝,實(shí)現(xiàn)相同的接口。

Javascript 中模仿接口的三種方法 1. 注釋描述
/*

interface Composite {
  function add(child);
  function remove(child);
  function getChild(index);
}

interface FormItem {
  function save();
}

 */

var CompositeForm = function(id, method, action) { // 定義接口類
  ...
};

// 為接口類添加方法
CompositeForm.prototype.add = function(child) {
  ...
};
CompositeForm.prototype.remove = function(child) {
  ...
};
CompositeForm.prototype.getChild = function(index) {
  ...
};

CompositeForm.prototype.save = function() {
  ...
};

此種方法不易規(guī)范遵守,屬于程序文檔范疇,對(duì)接口的約定遵守全靠自覺(jué)。但是易于實(shí)現(xiàn),不需額外的類或函數(shù)。

2. 屬性檢查
/*

interface Composite {
  function add(child);
  function remove(child);
  function getChild(index);
}

interface FormItem {
  function save();
}

 */

var CompositeForm = function(id, method, action) {
  this.implementsInterfaces = ["Composite", "FormItem"];
  ...
};

...

function addForm(formInstance) {
  if (!implements(formInstance, "Composite", "FormItem")) {
    throw new Error("Object does not implement a required interface.");
  }
  ...
}

// 檢查一個(gè)對(duì)象是否實(shí)現(xiàn)了需要的接口
function implements(object) {
  for (var i = 1; i < arguments.length; i++) {
    var interfaceName = arguments[i];
    var interfaceFound = false;
    for (var j = 0; j < object.implementsInterfaces.length; j++) {
      if (object.implementsInterfaces[j] == interfaceName) {
        interfaceFound = true;
        break;
      }
    }
    if (!interfaceFound) {
      return false; // 未找到接口
    }
  }
  return true; // 所有接口都找到了
}

此方法的優(yōu)點(diǎn)是對(duì)類實(shí)現(xiàn)的接口提供了文檔說(shuō)明,如果需要的接口未實(shí)現(xiàn)則會(huì)報(bào)錯(cuò)。缺點(diǎn)在于不能保證類是否真正實(shí)現(xiàn)了接口,只知道它是否說(shuō)自己實(shí)現(xiàn)了接口,即使代碼未將接口實(shí)現(xiàn)也能通過(guò)檢查,這將在代碼中留下隱患。

3. 鴨式辨型

鴨式辨型的意思就是,如果對(duì)象具有與接口定義的方法同名的所有方法,那么就認(rèn)為它實(shí)現(xiàn)了這個(gè)接口。

// Interfaces

var Composite = new Interface("Composite", ["add", "remove", "getChild"]);
var FormItem = new Interface("FormItem", ["save"]);

// CompositeForm class

var CompositeForm = function(id, method, action) {
  ...
};

...

function addForm(formInstance) {
  // 如果需要的方法未實(shí)現(xiàn)則報(bào)錯(cuò)
  ensureImplements(formInstance, Composite, FormItem);
  ...
}

ensureImplements函數(shù)至少接受兩個(gè)參數(shù),一個(gè)是需要檢查的對(duì)象,其余為針對(duì)此對(duì)象需要檢查是否實(shí)現(xiàn)的接口。具體檢查方式則是檢查對(duì)象是否實(shí)現(xiàn)了接口所聲明的所有方法。

此方法的缺點(diǎn)是缺乏其他兩種方法的自我描述性,需要一個(gè)輔助類Interface和一個(gè)輔助函數(shù)ensureImplements。并且它只關(guān)心方法名稱而不檢查參數(shù)名稱、數(shù)目、類型等。

Interface

綜合第一及第三種接口實(shí)現(xiàn)方式,Interface類的定義可以為:

// Constructor

var Interface = function(name, methods) {
  if (arguments.length != 2) {
    throw new Error("Interface constructor called with " + arguments.length +
      " arguments, but expected exactly 2.");
  }

  this.name = name;
  this.methods = [];
  for (var i = 0, len = methods.length; i < len; i++) {
    if (typeof methods[i] !== "string") {
      throw new Error("Interface constructor expects method names to be " +
        " passed in as a string");
    }
    this.methods.push(methods[i]);
  }
};

// Static class method

Interface.ensureImplements = function(object) {
  if (arguments.length < 2) {
    throw new Error("Function Interface.ensureImplements called with " +
      arguments.length + " arguments, but expected at least 2.");
  }

  for (var i = 1, len = arguments.length; i < len; i++) {
    var interface = arguments[i];
    if (interface.constructor !== Interface) {
      throw new Error("Function Interface.ensureImplements expects arguments" +
        "two and above to be instances of Interface.");
    }

    for (var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
      var methods = interface.methods[j];
      if (!object[method] || typeof object[method] !== "function") {
        throw new Error("Function Interface.ensureImplements: object " +
          "does not implement the " + interface.name +
          " interface. Method " + method + " was not found.");
      }
    }
  }
};
依賴接口的設(shè)計(jì)模式

以下的設(shè)計(jì)模式依賴接口
1. 工廠模式 保證生產(chǎn)出來(lái)的對(duì)象實(shí)現(xiàn)了必須的方法。
2. 組合模式 將對(duì)象群體與組成對(duì)象同等對(duì)待。
3. 裝飾者模式 透明地為另一對(duì)象提供包裝,實(shí)現(xiàn)相同的接口。
4. 命令模式 所有的命令對(duì)象都實(shí)現(xiàn)了同一批方法。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87513.html

相關(guān)文章

  • 001-讀書筆記-JavaScript高級(jí)程序設(shè)計(jì) JavaScript簡(jiǎn)介

    摘要:由于計(jì)算機(jī)的國(guó)際化,組織的標(biāo)準(zhǔn)牽涉到很多其他國(guó)家,因此組織決定改名表明其國(guó)際性。規(guī)范由萬(wàn)維網(wǎng)聯(lián)盟制定。級(jí)標(biāo)準(zhǔn)級(jí)標(biāo)準(zhǔn)是不存在的,級(jí)一般指的是最初支持的。 這篇筆記的內(nèi)容對(duì)應(yīng)的是《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》中的第一章。 1.ECMA 和 ECMA-262 ECMA 是歐洲計(jì)算機(jī)制造商協(xié)會(huì)的縮寫,全程是 European Computer Manufacturers Ass...

    masturbator 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式讀書筆記(七)——適配器模式

    摘要:與門面模式的聯(lián)系本文要說(shuō)的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說(shuō)。我們以中的一個(gè)為例,說(shuō)說(shuō)實(shí)際應(yīng)用中的適配器模式的使用方法。而如果實(shí)現(xiàn)層的問(wèn)題不大,要解決一部分適配問(wèn)題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說(shuō)的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說(shuō)。它們都對(duì)類的接口進(jìn)行了一些改變。門面模式是把相似的或是完成相關(guān)任務(wù)的接...

    AZmake 評(píng)論0 收藏0
  • Javascript 設(shè)計(jì)模式讀書筆記(二)——封裝,簡(jiǎn)單的創(chuàng)建對(duì)象模式

    摘要:創(chuàng)建對(duì)象中,創(chuàng)建對(duì)象的基本模式有三種。因此,在設(shè)計(jì)構(gòu)造函數(shù)時(shí),需要進(jìn)行慎重考慮。因此在中,這種問(wèn)題被稱作繼承破壞封裝。靜態(tài)成員每個(gè)只有一份,直接通過(guò)類對(duì)象進(jìn)行訪問(wèn)。 什么是封裝 找工作時(shí)一些公司給了offer后我就想知道真正拿到手的是多少,畢竟賦稅繁重。但各種稅也好,五險(xiǎn)一金也好我實(shí)在是弄不清楚,于是我就會(huì)在網(wǎng)上的一些稅后收入計(jì)算器上進(jìn)行計(jì)算,只需要填寫一些基本信息,比如稅前收入,所...

    lentrue 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式讀書筆記(六)——門面模式

    摘要:簡(jiǎn)單的門面模式實(shí)例事件綁定函數(shù)門面模式的作用是將復(fù)雜的接口進(jìn)行包裝,變成一個(gè)便于使用的接口。還是以事件相關(guān)為例,事件綁定中還有兩個(gè)常用的分別是和。 門面模式是什么,與其我去用笨拙的語(yǔ)言去解釋,不如看下面這張圖,曾經(jīng)在網(wǎng)上很火的一張圖片,說(shuō)的是一位兒子為他的爸媽設(shè)置的電腦桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了這些起好名字...

    pubdreamcc 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式讀書筆記(五)——工廠模式

    摘要:假設(shè)有一個(gè)生產(chǎn)交通工具的工廠類,它包含生成多種交通工具實(shí)例的方法。在使用這個(gè)類生產(chǎn)對(duì)象的時(shí)候,傳入?yún)?shù),在參數(shù)中的屬性規(guī)定我們需要的類型,構(gòu)造函數(shù)就能夠返回我們需要的對(duì)象類型了。 一般來(lái)說(shuō),創(chuàng)建對(duì)象的時(shí)候我們都習(xí)慣使用new關(guān)鍵字來(lái)調(diào)用constructor構(gòu)造函數(shù),但使用這種方式會(huì)有一些缺點(diǎn),首先構(gòu)造器函數(shù)的創(chuàng)建本身就是為了模仿其他一些面向?qū)ο笳Z(yǔ)言的特性,有些人覺(jué)得這是non-sen...

    Eirunye 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<