成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

外觀設(shè)計(jì)模式

zzbo / 691人閱讀

摘要:外觀設(shè)計(jì)模式的優(yōu)點(diǎn)易于使用在實(shí)現(xiàn)形式上通常占用較小的內(nèi)存。抽象的注意事項(xiàng)外觀設(shè)計(jì)模式雖然少有劣勢(shì),但值得注意的一個(gè)問(wèn)題是性能。

當(dāng)我們豎起一個(gè)門(mén)面時(shí),我們向外展示的只是一種外表,它可能隱藏著一個(gè)非同一般的事實(shí)。這也就是我們所要說(shuō)的外觀設(shè)計(jì)模式,這種模式為一大段的代碼體提供了一個(gè)便捷的高級(jí)接口,隱藏了底層復(fù)雜的實(shí)現(xiàn)。這種設(shè)計(jì)模式簡(jiǎn)化代碼的呈現(xiàn)形式,給開(kāi)發(fā)人員一個(gè)API,同時(shí)也能提高代碼的可用性。

外觀設(shè)計(jì)模式在JavaScript的庫(kù)中很常見(jiàn),例如JQuery,盡管實(shí)現(xiàn)的是可能支持具有廣泛行為的方法(如:$("selector")用來(lái)獲取selector所指代的對(duì)象),但展示給使用者的只是一個(gè) facade 或者這些方法的有限抽象。

我們經(jīng)常正面接觸的是外觀(Facade),而不是外觀背后具體實(shí)現(xiàn)的子系統(tǒng)。就如我們用jQuery,不管什么時(shí)候都是用的$(el).css(),$(el).animate(),我們使用的都是用的簡(jiǎn)單的公共接口,這樣避免我們手動(dòng)調(diào)用jQuery core的內(nèi)部方法,也避免了手動(dòng)操作與dom的交互和維護(hù)狀態(tài)變量的需要。

jQuery core的方法被視為中間抽象。開(kāi)發(fā)人員直接接觸的是DOM API和讓jQuery變得好用的外觀設(shè)計(jì)模式的應(yīng)用(Facade pattern)

基于我們所了解到的,外觀設(shè)計(jì)模式簡(jiǎn)化了一個(gè)類(lèi)接口,并弱化類(lèi)的使用。不直接于子系統(tǒng)進(jìn)行交互可以減少錯(cuò)誤的出現(xiàn)率。

外觀設(shè)計(jì)模式的優(yōu)點(diǎn):

1.易于使用

2.在實(shí)現(xiàn)形式上通常占用較小的內(nèi)存。

這里有一個(gè)未經(jīng)優(yōu)化的例子,它能實(shí)現(xiàn)監(jiān)聽(tīng)事件的跨瀏覽器使用,這種情況我們一般是通過(guò)創(chuàng)建一個(gè)通用的方法來(lái)實(shí)現(xiàn),在方法中我們檢查被使用的屬性是否存在,以便提供安全且能跨瀏覽器的解決方案。

var addMyEvent = function( el, ev, fn ){

   if( el.addEventListener ) {
            el.addEventListener( ev, fn, false );
      } else if(el.attachEvent) {
            el.attachEvent( "on" + ev, fn );
      } else {
           el["on" + ev] = fn;
    }
 
};

在jQuery中我們找到了一個(gè)相似的實(shí)現(xiàn) $(document).ready(...),而其內(nèi)部的實(shí)現(xiàn)是通過(guò)調(diào)用 bindReady() 方法來(lái)實(shí)現(xiàn)的,如下是其內(nèi)部實(shí)現(xiàn):

bindReady: function() {
    ...
    if ( document.addEventListener ) {
      // Use the handy event callback
      document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
      // A fallback to window.onload, that will always work
      window.addEventListener( "load", jQuery.ready, false );
 
    // IE 情況下
    } else if ( document.attachEvent ) {
 
      document.attachEvent( "onreadystatechange", DOMContentLoaded );
 
      window.attachEvent( "onload", jQuery.ready );
               ...

用戶(hù)只使用這個(gè)被暴露出來(lái)的 $(document).ready(...) 即可,其他的復(fù)雜實(shí)現(xiàn),被隱藏了起來(lái)。

外觀設(shè)計(jì)模式不一定多帶帶使用,它可能和其他設(shè)計(jì)模式一起使用,例如:Module設(shè)計(jì)模式,正如我們下面看到的,我們的模塊設(shè)計(jì)模式的實(shí)例包含了一些私有的方法。通過(guò)外觀設(shè)計(jì)模式可以用一些更簡(jiǎn)單的API訪問(wèn)這些方法。

var module = (function() {

    var _private = {
        i: 5,
        get: function() {
            console.log( "current value:" + this.i);
        },
        set: function( val ) {
            this.i = val;
        },
        run: function() {
            console.log( "running" );
        },
        jump: function(){
            console.log( "jumping" );
        }
    };
 
    return {
 
        facade: function( args ) {
            _private.set(args.val);
            _private.get();
            if ( args.run ) {
                _private.run();
            }
        }
    };
}());
 
 
// usage
module.facade( {run: true, val: 10} );
// Outputs: "current value: 10" and "running"

在這個(gè)示例中,調(diào)用 module.facade() 將最終最終出發(fā)一個(gè)私有方法 set ,使用者不關(guān)心這個(gè),他只只要調(diào)用就可以了,而不用擔(dān)心實(shí)現(xiàn)的具體細(xì)節(jié)。

抽象的注意事項(xiàng)

外觀設(shè)計(jì)模式雖然少有劣勢(shì),但值得注意的一個(gè)問(wèn)題是性能。

抽象出一個(gè)外觀設(shè)計(jì)模式都要花費(fèi)一些抽象成本,這樣我們就要靠這個(gè)成本的花費(fèi)是否合理。

以Jquery庫(kù)中的獲取元素為例,原生的getElementById("identifer")要比$("#identifer")的速率要快的多,但是我們要記住jquery的Sizzle選擇器引擎在幕后做了很多的優(yōu)化查詢(xún),同時(shí)他返回一個(gè)jquery對(duì)象,而不是返回一個(gè)dom節(jié)點(diǎn)。

這個(gè)特殊的外觀設(shè)計(jì)模式為了實(shí)現(xiàn)一個(gè)優(yōu)雅的選擇器函數(shù),它能接受和解析多種類(lèi)型的查詢(xún),但它隱含著抽象的成本。時(shí)間證明jquery的Sizzle引擎是成功的。實(shí)際上一個(gè)簡(jiǎn)單的外觀設(shè)計(jì)模式為一個(gè)團(tuán)隊(duì)來(lái)說(shuō)是很有必要的,在使用模式時(shí)注意所涉及的性能成本,對(duì)它們是否值得提供抽象調(diào)用做評(píng)估。

其它設(shè)計(jì)模式相關(guān)文章請(qǐng)轉(zhuǎn)‘大處著眼,小處著手’——設(shè)計(jì)模式系列

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90530.html

相關(guān)文章

  • 被誤讀的設(shè)計(jì)模式

    摘要:可以說(shuō),如果問(wèn)題是我們的敵人,代碼是我們的劍,設(shè)計(jì)模式就是高手心中的劍譜。中級(jí)選手,在編程的時(shí)候知道何時(shí)該用什么設(shè)計(jì)模式,而什么時(shí)候不該用。設(shè)計(jì)模式被用來(lái)簡(jiǎn)化設(shè)計(jì),讓設(shè)計(jì)更優(yōu)雅。其中最具有普遍性的方案往往就是我們的設(shè)計(jì)模式的內(nèi)容。 showImg(https://segmentfault.com/img/remote/1460000019100076?w=800&h=440); 目錄概...

    William_Sang 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式(七):設(shè)計(jì)模式分類(lèi)

    摘要:原文地址設(shè)計(jì)模式七設(shè)計(jì)模式分類(lèi)根據(jù)目的和范圍,設(shè)計(jì)模式可以分為五類(lèi)。按照目的分為創(chuàng)建設(shè)計(jì)模式,結(jié)構(gòu)設(shè)計(jì)模式,以及行為設(shè)計(jì)模式。與類(lèi)的設(shè)計(jì)模式不同,對(duì)象設(shè)計(jì)模式主要用于運(yùn)行期對(duì)象的狀態(tài)改變動(dòng)態(tài)行為變更等。 原文地址:PHP設(shè)計(jì)模式(七):設(shè)計(jì)模式分類(lèi) Introduction 根據(jù)目的和范圍,設(shè)計(jì)模式可以分為五類(lèi)。按照目的分為:創(chuàng)建設(shè)計(jì)模式,結(jié)構(gòu)設(shè)計(jì)模式,以及行為設(shè)計(jì)模式。按照范圍分為:...

    tracymac7 評(píng)論0 收藏0
  • PHP 設(shè)計(jì)模式概述

    摘要:創(chuàng)建型模式主要有以下五種簡(jiǎn)單工廠模式和工廠方法模式抽象工廠模式單例模式建造者模式原型模式在設(shè)計(jì)模式一書(shū)中將工廠模式分為兩類(lèi)工廠方法模式與抽象工廠模式。 一、 設(shè)計(jì)模式(Design pattern)是什么 設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉、經(jīng)過(guò)分類(lèi)編目的代碼設(shè)計(jì)的經(jīng)驗(yàn)總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 二、 為什么會(huì)有設(shè)計(jì)模式 在軟件開(kāi)發(fā)過(guò)...

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

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

0條評(píng)論

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