zoukankan      html  css  js  c++  java
  • js 设计模式-接口

    js模拟java接口检测函数;确保子类实现接口中的方法:(出自js设计模式)

    上代码:

    <script type="text/javascript" >

     

    <%--接口工厂方法 start--%>

    /**
    name:接口名称;字符串类型
    arr_method:接口中的方法名称;数组形式['method1','method2',····]

    可以定义接口名称和接口定义的方法名称,
    **/

        //首先编写接口创建工厂,用来创建接口,用以 定义接口需要定义的方法
        var Interface = function(interfaceName,arrMethod){
        //首先校验接口的数据准确性
          if(arguments.length!=2){
            throw new Error("定义接口只需要两个参数,一个接口的名字,一个接口要实现的方法【以数组形式】传递进来");
            return;
          }
          this.name = interfaceName;
          this.arrmethod = [];
          var name = "";
          //接口方法名字的校验
          for(var i=0,j=arrMethod.length;i<j;i++){
            name = arrMethod[i];
            if(typeof name !=='string'){
              throw new Error("接口方法只能是字符串类型;"+name+" 不是字符串类型!");
              return;
            }
            this.arrmethod.push(name);
          }
        }

        //下来是接口工厂方法,确认你传入的对象有没有实现接口方法;
        Interface.enSureImplement = function(obj,interfaceInstance){
        //首先进行参数校验
          if(arguments.length<2){
            throw new Error("至少需要两个或两个以上的参数,第一个参数为要检测的对象o,后面的参数为要检测的接口实例(不是实现了接口的实例,而是接口本          身);该函数用来检测o是否实现了后面接口实例的所有方法");
          }
        //然后是接口参数的校验,及对象是否实现了接口的方法
          for(var i=1,j=arguments.length;i<j;i++){
            var interfaceIns = arguments[i];
            //alert(interfaceIns.constructor);
            if(interfaceIns.constructor !==Interface){
              throw new Error(" 需要的接口参数是 实现了Interface接口的实例;其构造方法为Interface的构造方法!");
            }
            var method="";
            for(var k=0,h=interfaceIns.arrmethod.length;k<h;k++){
              method = interfaceIns.arrmethod[k];
              if(!obj[method]||typeof obj[method] !=='function'){//判断对象obj是否实现了接口的方法
                throw new Error(obj+" 没有实现 "+interfaceIns.name+ " 接口的"+method+" 方法!");
              }
            }
          }
        }
    <%--接口工厂方法 end--%>

    <%--接口工厂方法测试用例 start--%>
        function InterfaceTest(instance){
          //下面定义了三个 接口
          var Inter1 = new Interface("Inter1",['run','cry','stop','pause']);
          var Inter2 = new Interface("Inter2",['light','tie','month','eye','leg']);
          var Inter3 = new Interface("Inter3",['study','lie','sing']);

          //检测对象instance是否实现了 该3个接口中的方法
          Interface.enSureImplement(instance,Inter1,Inter2,Inter3);

          //如果检测通过了,instance可以比较安全的 运行它自己的方法,而不用担心自己当中没有没有实现的方法
          //。。。。。。。。。。。
    }
    <%--接口工厂方法测试用例 start--%>

        function TObj(name){
          this.name = name;
        }
        TObj.prototype= {
          run:function(){},
          cry:function(){},
          stop:function(){},
          //pause:function(){},
          light:function(){},
          eye:function(){},
          tie:function(){},
          month:function(){},
          //leg:function(){},
          study:function(){},
          lie:function(){},
          //sing:function(){},
          toString:function(){
            return this.name;
          }
        }
        try{
          InterfaceTest(new TObj("张珊"));
        }catch(e){
          alert(e);
        }

    </script>

     

    注: 接口可以使用在大项目的开发阶段(不要过早优化(去除它)),对提升运行效率并没有多大的帮助,会增加开发难度,但是可以降低模块之间的耦合度;在开发阶段有的模块还没有编写,但是为了不影响开发速度,可以先给出接口;

  • 相关阅读:
    剑指 Offer 33. 二叉搜索树的后序遍历序列
    剑指 Offer 32
    OCR技术浅析-tesserOCR(3)
    OCR技术浅析-自写篇(2)
    OCR技术浅析-无代码篇(1)
    SVN服务器+客户端安装和配置
    Git命令集
    数组模拟队列与单调队列求解滑动窗口
    upper_bound与lower_bound
    图中连通块的划分
  • 原文地址:https://www.cnblogs.com/happy-rabbit/p/4549724.html
Copyright © 2011-2022 走看看