1. 程式人生 > >JavaScript_10設計模式(建立介面的方式【三】)鴨式辯型法

JavaScript_10設計模式(建立介面的方式【三】)鴨式辯型法

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>New Web Project</title>
    <script type="text/javascript" charset="UTF-8">
        /**
         * 實現介面的第三種方法:
         *      鴨式辯型實現(是最完美的JavaScript實現介面方式)。
         * 註解描述法、屬性檢測法
         * 
         *  鴨式辯型實現核心:
         *  1.目的,一個類實現介面的主要目的:把接口裡的方法都實現了。
         * 2.完全面向物件,程式碼統一。
         * 
         * 
         */
        //一、介面類  Class Interface==>例項化N多個介面。
        /***
         * 介面類需要幾個引數?(2個)
         * 引數1:介面名
         * 引數2:methods  接收方法名稱的陣列(集合)。
         * 
         */
        var Interface=function(name,methods){
            //判斷介面引數的個數:
            if(arguments.length!=2){
                throw new Error("this instance constructor arguments must be 2 length");
            }
            this.name=name;
            this.methods=[];//定義一個內建的空陣列物件,等待接收 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]);
            }
            
        }


        //二、準備工作:具體的實現類 
       
        //1.例項化介面物件
        var CompositeInterface=new Interface('CompositeInterface',['add','remove']);
        var FormItemInterface=new Interface('FormItemInterface',['update','select']);
        
       //2.CompositeImp interface 具體的實類現
        var CompositeImpl =function(){
            
        }
        //3.implents method  實現介面的方法
        CompositeImpl.prototype.add=function(obj){
            alert('add');
        }
         CompositeImpl.prototype.remove=function(obj){
            alert('remove');
        }
          CompositeImpl.prototype.update=function(obj){
            alert('update');
        }
          CompositeImpl.prototype.select=function(obj){
            alert('select');
        }
        
        
        
        //三 、檢驗接口裡的方法
        //如果檢驗通過,不做任何操作。如果不通過,瀏覽器丟擲異常(error)。
       //這個方法的目的就是檢測方法的。
        Interface.ensureImplements=function(object){
          //如果檢測方法,接收的引數小於2個,引數傳遞失敗。
            if(arguments.length<2){
                throw new Error('Interface.ensureImplements method constructor arguments must be>=2!');
            }
            //獲得介面實列物件
            for(var i=1,len=arguments.length;i<len;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];
                    //object(key)就是方法
                    if(!object[methodName]||typeof object[methodName]!=='function'){
                        throw new Error('the method is not found!');
                    }
                }
            }
        }
        
        var c1=new CompositeImpl();
      
        Interface.ensureImplements(c1,CompositeInterface,FormItemInterface);
        
        c1.add();
        
    </script>
</head>
<body>
    <h1>New Web Project Page</h1>
</body>