<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0

    文:阿蜜果/2011-11-10

    轉載請注明出處

             看一年前在當當網所買,卻還嶄新的那本《JavaScript設計模式》(Rose HarmesDustin Diaz 著,謝廷晟 譯,人民郵電出版社出版),作者將GoF合著的《Design Patterns》一書中若干設計模式在JavaScript中的應用給了詳盡的解說,不失為一本好書。

             我比較喜歡的設計模式有工廠模式、適配器模式、組合模式和觀察者模式等,本文總結書中關于適配器模式的講解,希望該模式能為讀者在JavaScript開發中所用。

    1、   什么是適配器模式?

    在計算機編程中,適配器模式將一個類的接口適配成用戶所期待的。一個適配允許通常因為接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。如果現有的接口能很好地滿足需要,那就可能沒有必要使用適配器。

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

    2、   適配器模式的應用場合

    下面舉幾個適合使用適配器模式的實例:

    (1)      參數類型不一致 假設有這樣一個對象,定義如下:

    var clientObject = {
        string1: 'foo',
        string2: 'bar',
        string3: 'baz'
    }
    ;

    另外有一個以三個字符串為參數的函數:

    function interfaceMethod(str1, str2, str3) {
        
    }

    為了將cientObject作為參數傳遞給interfaceMethod方法,可使用適配器模式解決:

    function clientToInterfaceAdapter(o) {
        interfaceMethod(o.string1, o.string2, o.string3);
    }

    現在可以將clientObject對象作為參數傳給clientToIntefaceAdapter方法:

    clientToIntefaceAdapter(clientObject);

    使用適配器模式節解決了參數類型有些許不一致造成的問題。

    2PS2-to-USB適配器:我比較喜歡這個關于適配器的例子,很好理解適配器的作用。 PC硬件為例,PS2插口是連接鼠標和鍵盤的標準接口。多年以來幾乎所有PC都帶有這種接口,鼠標和鍵盤的設計人員因此就有了一個固定的設計目標。后來硬件工程師發明了可以完全替代PS2接口的技術,這種設計改用USB系統來支持鍵盤、鼠標和其他外設。

    但是問題出現了,對于設計主板的工程師來說,消費者有沒有USB鍵盤都無所謂,他們決定不再支持PS2插口,以便降低成本和節省空間。但是鍵盤和鼠標的設計者要想賣掉以前針對PS2接口成產的成千上萬的鍵盤和鼠標,需要有適配器的支持才行,PS2-to-USB應運而生。

    3、   JavaScript中使用適配器模式

    現在可供選擇的庫非常多,看看哪套工具最適合自己的需要,以及它們對自己的開發會帶來什么影響。此外還要考慮開發人員的編程風格、實現難易程度和兼容性等等問題。即使以前選定了庫,但可能出于性能、安全或設計等方面的考慮,可能會更換所用的庫。

    那要怎么樣才能實現兩個庫之間的平滑過渡呢?此時可以使用適配器模式從一套API過渡到另一套API。例如在下面的實例中實現的是從Prototype庫的$函數到YUIYahoo!User Interface)的get方法的轉換。這兩個函數功能相似,但接口方面有些區別。首先看看Prototype$函數:

    function $() {
        
    var elements = new Array();
        
    for (var i = 0; i < arguments.length; i++{
            
    var element = arguments[i];
            
    if (typeof element == 'string') {
                element 
    = document.getElementById(element);
            }

            
            
    if (arguments.length == 1{
                
    return element;
            }


            elements.push(element);
        }

        
    return elements;
    }

    YUIYahoo!User Interface)的get方法的代碼如下:

    YAHOO.util.Dom.get = function() {
        
    if (YAHOO.lang.isString(el)) {
            
    return document.getElementById(el);
        }


        
    if (YAHOO.lang.isArray(el)) {
            
    var c = [];
            
    for (var i = 0, len = el.length; i < len; ++i) {
                c[c.length] 
    = YAHOO.util.Dom.get(el[i]);
            }

            
    return c;
        }


        
    if (el) {
            
    return el;
        }

        
    return null;
    }
    ;

    兩者的區別:get具有一個參數,這個參數可以是一個HTML元素、字符串或由字符串或HTML元素組成的數組。而$函數沒有正式列出參數,而是允許用戶傳入任意數目的參數,可以是字符串或HTML元素。

    如果想要Prototype$函數改為使用YUIget方法,可使用如下這個適配器:

    function PrototypeToYUIAdapter() {
        
    return YAHOO.util.Dom.get(arguments);
    }

    只要添加如下代碼后,在Prototype代碼庫被替換YAHOO后,$方法可以照用:

    $= PrototypeToYUIAdapter;

    YAHOOget方法適配成Prototype$方法的適配器如下:

    function YUIToPrototypeAdapter(el) {
        
    return $.apply(window, el instanceof Array ? el : [el]);
    }

    只要添加如下代碼后,在YAHOO代碼庫被替換Prototype后,get方法可以照用:

    YAHOO.util.Dom.get = YUIToPrototypeAdapter;

     

    4、   適配器模式的優缺點

    適配器最大的優點是可以避免大規模的改寫現有客戶代碼。

    如果現有API還未定形,或新接口還未定形,此時并不適合使用適配器模式。

    5、   參考文檔

    1)《JavaScript設計模式》 Ross HarmesDustin Dial著,謝廷晟 譯,人民郵電出版社出版

    2)《適配器模式_百度百科》:

    http://baike.baidu.com/view/3371585.htm

     

    posted on 2011-11-10 23:12 阿蜜果 閱讀(1901) 評論(1)  編輯  收藏 所屬分類: JavascriptDesign Pattern


    FeedBack:
    # re: 蜜果私塾:在JavaScript中使用適配器模式
    2011-11-11 13:35 | tbw淘寶
    很好  回復  更多評論
      
    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294296
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 色窝窝亚洲av网| 亚洲youwu永久无码精品| 波多野结衣免费一区视频| 亚洲婷婷国产精品电影人久久| 亚洲AV无码国产剧情| 国产免费av一区二区三区| 日韩欧美亚洲中文乱码| 又黄又大又爽免费视频| 国产精品视频全国免费观看| 国产成人A亚洲精V品无码| 成人黄网站片免费视频| 亚洲AV无码一区二区乱子伦| 91av免费观看| 亚洲熟妇丰满xxxxx| 国产一区视频在线免费观看| 国产精品免费久久久久久久久| 在线观看亚洲精品国产| 久久免费线看线看| 亚洲国产成人精品久久| 日韩免费一级毛片| 黄床大片免费30分钟国产精品| 亚洲网址在线观看你懂的| 一色屋成人免费精品网站| 日本亚洲欧美色视频在线播放| 亚洲精品成人在线| 99精品在线免费观看| 亚洲www77777| 亚洲一区二区三区乱码A| 免费人成视频在线观看网站| 亚洲日本国产综合高清| 亚洲精品456播放| 99热在线免费观看| 亚洲精品无码中文久久字幕| 亚洲无av在线中文字幕| 无码av免费毛片一区二区| 国产av无码专区亚洲av毛片搜| 国产AV无码专区亚洲A∨毛片| 成年在线观看网站免费| 亚洲国产免费综合| 亚洲国产激情在线一区| 亚洲色偷偷狠狠综合网|