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>
注: 接口可以使用在大项目的开发阶段(不要过早优化(去除它)),对提升运行效率并没有多大的帮助,会增加开发难度,但是可以降低模块之间的耦合度;在开发阶段有的模块还没有编写,但是为了不影响开发速度,可以先给出接口;
js 设计模式-接口的更多相关文章
- js设计模式总结1
js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
- JS设计模式(一)
刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...
- js设计模式(12)---职责链模式
0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...
- JS设计模式——5.单体模式
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
- 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...
- [js]js设计模式小结
js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...
- [js]设计模式小结&对原型的修改
js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...
- html中通过js获取接口JSON格式数据解析以及跨域问题
前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据.经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便 ...
随机推荐
- 使用Strust2框架写HelloWorld
使用Strust2框架写HelloWorld 一.创建JavaWeb项目 二.搭建Stust2 FrameWork开发环境 三步完成Struts2 FrameWork开发环境的搭建 1.加入搭建Str ...
- C#快速学习
C#快速学习笔记(译) 下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { ...
- div光标定位问题总结
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 总结C++中取成员函数地址的几种方法
这里, 我整理了4种C++中取成员函数地址的方法, 第1,2,4种整理于网上的方法, 第3种cdecl_cast是我自己想到的. 其中, 第4种(汇编)的方法不能在VC6上编译通过. 推荐使用第1,2 ...
- JS实现以日历形式显示当前时间
效果图: <script language="Javascript"> var datelocalweek=new Array("星期日", &qu ...
- [转载]expect spawn、linux expect 用法小记
原文地址:expect spawn.linux expect 用法小记作者:悟世 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写 ...
- var, object, dynamic的区别以及dynamic的使用
var, object, dynamic的区别以及dynamic的使用 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 2013-06- ...
- 微软必应借PK谷歌突围中国搜索市场
Bing“必应”是微软2009年推出的搜索品牌(http://www.bing.com),它取代的是同门师兄Live Search.进入2013年,在国内及好莱坞的多部大片里面,我都看到了Bing搜索 ...
- autotools入门笔记(二)——创建和使用静态库、动态库
带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...
- 你的MongoDB Redis设置用户名密码了吗?看看shodan这款邪恶的搜索引擎吧!~
早上看新闻的时候看到了个醒目的新闻 开源中国:MongoDB 赎金事件持续发酵,究竟是谁之过? 博客园:MongoDB数据库勒索,中国受害者数量超乎你的想象,SOS! 1. 由于自己之前做过的项目,R ...