<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 阿蜜果 閱讀(1902) 評論(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

    積分與排名

    • 積分 - 2294512
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品专区| 亚洲AV永久无码精品一福利| 亚洲风情亚Aⅴ在线发布| 一级毛片完整版免费播放一区| 一级毛片aaaaaa免费看| 四虎影视永久免费观看网址| 亚洲欧洲一区二区| 在线亚洲v日韩v| 特级无码毛片免费视频尤物 | 国产一区二区免费视频| 一个人免费观看在线视频www| 亚洲午夜精品久久久久久浪潮| 亚洲精品91在线| 五月天婷婷精品免费视频| 亚洲视频在线观看免费视频| 亚洲精品无码激情AV| 亚洲综合精品成人| 国产成人免费视频| 亚洲成a人无码av波多野按摩| 亚洲国产高清在线精品一区| 久久精品成人免费观看97| 成人毛片免费观看| 亚洲大片在线观看| 人成免费在线视频| 好大好硬好爽免费视频| 亚洲专区在线视频| 国产精品免费观看视频| 免费黄色毛片视频| 亚洲成A∨人片在线观看无码| 在线看片免费人成视频福利| 免费人成在线观看网站品爱网日本| 亚洲成在人线中文字幕| 国产一区二区三区免费| 国产精品亚洲精品日韩已方| 亚洲第一成年免费网站| 69av免费视频| 亚洲高清在线播放| 久久www免费人成精品香蕉| 免费a级毛片永久免费| 亚洲国产精品网站在线播放 | 2019中文字幕免费电影在线播放 |