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>

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

js 设计模式-接口的更多相关文章

  1. js设计模式总结1

    js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...

  2. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

  3. JS设计模式(一)

    刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...

  4. js设计模式(12)---职责链模式

    0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...

  5. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  6. 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发

    一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...

  7. [js]js设计模式小结

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...

  8. [js]设计模式小结&对原型的修改

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...

  9. html中通过js获取接口JSON格式数据解析以及跨域问题

    前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据.经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便 ...

随机推荐

  1. Linux : fedora 安装 vnc server

    Linux配置VNC服务 安装VNC服务端 #yum install vnc-server 配置VNC服务参数文件 编辑vncservers文件追加如下 #vi /etc/sysconfig/vncs ...

  2. [Usaco2008 Open] Clear And Present Danger 寻宝之路[最短路][水]

    Description     农夫约翰正驾驶一条小艇在牛勒比海上航行.     海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛.一 张藏宝图上说,如果他的路程上 ...

  3. 第一章 CLR 的执行模型

    CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...

  4. SVN版本冲突解决详解

    SVN版本冲突解决详解 分类: SVN(SubVersion)2009-11-23 15:45 27014人阅读 评论(12) 收藏 举报 svnsubversion服务器文档工作c 版本冲突原因: ...

  5. [转]ARM/Thumb/Thumb-2

    ref:http://kmittal82.wordpress.com/2012/02/17/armthumbthumb-2/ A few months ago I gave a presentatio ...

  6. 线性回归,logistic回归和一般回归

    1 摘要 本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识.前四节主要讲述了回归问题,回归属于有监督学习中的一种方法.该方法的核心思想是从连续型统计数据中得到数学模型,然后将该数 ...

  7. Sublime中开发Ruby

    Ruby:Sublime中开发Ruby需要注意的Encoding事项 目录 背景Sublime相关默认的文件存储编码:UTF8默认的输出控制台编码:UTF8修改默认的输出控制台编码Ruby相关默认的代 ...

  8. 前端基于easyui的mvc扩展(续)

    前端基于easyui的mvc扩展(续) 回顾及遗留问题 上一篇讲解了基于easyui的mvc扩展的基本实现,已经降低了在mvc内使用easyui的难度,但是仍然还有一些问题: 当我们要给生成的控件设置 ...

  9. map 类型

    map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...

  10. 去除scons构建动态库的前缀lib

    如何使用scons构建工程,请参考快速构建C++项目工具Scons,结合Editplus搭建开发环境. 编译SharedLibrary项目的时候,生产的so文件时自动加上lib, 例如: env = ...