js設計模式

來源:互聯網
上載者:User

標籤:參數   利弊   多次   建立   來講   沒有   類型   面向   not found   

1.介面

    -介面是物件導向javaScript程式員工具箱中最有用的工具之一,那麼對於javaScript沒有定義介面的概念,

我們通過類比進階程式語言的方式來建立javaScript中的介面。

  -介面的概念:提供一種以說明一個對象應該有哪些方法的手段。

  -通常建立javaScript介面的三種方式:

    -1.注釋描述介面

    

<script type="text/javascript" charset="utf-8">            // javaScript中,定義介面有三種方式            // 1.註解描述(特點,1.程式員可以有一個參考,2缺點是還是屬於文檔範疇,3如果程式員忘記了定義方法,不會出錯。)            // 缺點,方式太過鬆散,並沒有檢查介面方式是否被完全實現。            /**             * interface Composite {             *                  *      function add();             *         function remove();             *         function update();             * }             */            // CompositImpl implements Composite            var CompositImpl = function () {                            };                        // 用原型對象做,直接寫在類裡,會多次建立方法。            CompositeImpl.prototype.add = function(obj) {                // do something            };                        CompositeImpl.prototype.remove = function(obj) {                // do something            };                        CompositeImpl.prototype.update = function(obj) {                // do something            };                    </script>

    -2.屬性檢測介面

<script type="text/javascript" charset="utf-8">            // 2.屬性檢測            /**             * interface Composite {             *                  *      function add();             *         function remove();             *         function update();             * }             *              * interface FormItem {             *         function select(obj);             * }             */                        // CompositImpl implements Coposite 和 FormItem            var CompositImpl = function (){                // 顯示的在類的內部接受所實現的介面                // 一般來講  在類的內部定義一個變數,名字要固定。這是一個規範                this.implemtnsInterface = [‘Comosite‘,‘FormItem‘];                            };                        CompositeImpl.prototype.add = function(obj) {                // do something                alert(‘add‘);            };                        CompositeImpl.prototype.remove = function(obj) {                // do something                alert(‘remove‘);            };                        CompositeImpl.prototype.update = function(obj) {                // do something                alert(‘update‘);            };                        CompositeImpl.prototype.select = function(obj) {                // do something                alert(‘select‘);            };                        // 定義一個方法去檢測 類是否實現了所有的介面            function checkCompositImpl() {                // 判斷當前對象是否實現了所有介面                if(!IsImplments(instance, ‘Composite‘, ‘FormItem‘)) {                    throw new Error(‘Object does not implement a required interface‘);                }            }                        // 判斷當前對象是否實現了所有介面            // 這個方法的主要目的就是判斷 執行個體對象有沒有實現相關的介面            function IsImplments(Object) {                //arguments 獲得實際參數                for (var i = 1; i < arguments.length; i++) {                    // 接受所實現的每一個介面的名字                    var interfaceNmae = arguments[i];                                        var interfaceFound = false;                                        for (var g = 0; g < Object.implemtnsInterface.length; g++) {                        if (Object.implemtnsInterface[g] == interfaceName) {                            interfaceFound = true;                            break;                        }                    }                                        if (!iterfaceName) {                        return false;                    }                }                return true;            }        </script>

    -3.鴨式辨型介面

<script type="text/javascript" charset="utf-8">            // 3.鴨式辨型(最完美的實現介面的方式)            // 核心:一個類實現介面的主要目的就是將介面中的方法全部實現。(檢測方法)            // 優點:完全物件導向,代碼也實現統一,也實現瞭解耦                                    // 1.介面類  Class Interface  ==> 執行個體化N多個介面                        /*             * 介面類需要兩個參數             * 1.介面的名字             * 2.接受方法名稱的數組             */            var Interface = function(name, methods) {                // 1.判斷介面的參數個數                if(arguments.length != 2) {                    throw new Error(‘this instance interface constructor must be 2 length‘);                }                this.name = name;                // 定義一個內建空數組,等待接受methods裡面的元素                this.methods = [];                for (var i = 0, len = methods.length; i < len; i++) {                    if(typeof methods[i] !== ‘string‘) {                        throw new Error(‘the interface method name is error!‘);                    }                    this.methods.push(methods[i]);                }            };                                    // 2.準備工作:具體的實作類別            // 執行個體化介面對象            var CompositeInterFace = new Interface(‘CompositeInterFace‘, [‘add‘, ‘remove‘]);            var FormItemInterFace = new Interface(‘FormItemInterFace‘, ‘update‘, ‘select‘);                        // CompositImpl 實現了CompositeInterFace和FormItemInterFace            var CompositImpl = function() {                            };                        CompositeImpl.prototype.add = function(obj) {                // do something                alert(‘add‘);            };                        CompositeImpl.prototype.remove = function(obj) {                // do something                alert(‘remove‘);            };                        CompositeImpl.prototype.update = function(obj) {                // do something                alert(‘update‘);            };                        CompositeImpl.prototype.select = function(obj) {                // do something                alert(‘select‘);            };                         // 3.檢驗介面裡的方法            // 如果檢驗通過,不做任何處理。如果沒有通過,則瀏覽器拋出異常            // 這個方法的目的就是檢測方法的            Interface.ensureImplments = function(Object) {                if(arguments.length < 2) {                    throw new Error(‘Interface.ensureImplments method constructor arguments must be >= 2‘);                }                                // 獲得介面執行個體對象                for (var i = 1; i < arguments.length; i++) {                    var instanceInterface = arguments[i];                    // 判斷參數是否是介面類的類型                    if (instanceInterface.constructor !== interface) {                        throw new Error(‘the arguments constructor not be Interface class!‘);                    }                    // 迴圈介面執行個體對象中的每一個方法                    for (var j = 0; j < instanceInterface.methods.length; j++) {                        // 用一個臨時變數接受每一個方法的名字(字串)                        var methodName = instanceInterface.methods[j];                        if(!Object[methodName] || typeof Object[methodName] != ‘function‘) {                            throw new Error(‘the method is not found‘);                        }                    }                }            };                        var c1 = new ComopsitImpl();                        Interface.ensureImplments(c1, CompositeInterFace, FormItemInterFace);        </script>        

  -介面的利弊:

    -對於一些中小程式來說,使用介面顯然是不明智的,對於項目來說介面的好處不明顯,只是徒增複雜度。

    -對於介面的好處,首先增進了代碼的重用,對於開發來講,還可以告訴程式員哪些類都使用了哪些方法,

如果你事Crowdsourced Security Testing道介面,那麼就減少了你在編碼的時候對類與類之間衝突,實現解耦。對於測試和調試也變得輕鬆。

對於javaScript的弱類型語言,類型不符很常見,使用介面會變得容易一些。

 

  

js設計模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.