什么是接口

接口提供了一种用以说明一个对象应该具有哪些方法的手段。

接口之利

1.接口具有自我描述性从而促进代码的重用

2.接口有助于稳定不同中的类之间的通信方式

3.测试和调试也变得更轻松

接口之弊

1.在一定程度上强化了类型的作用

2.js中没有内置的interface,实现它会增加复杂度

3.实现接口会对性能造成一定的影响

4.无法强迫其他程序员遵守你定义的接口

三种方法在JS中模仿接口

注释法(这只是一种文档规范)

/*
interface Composite{
function add(child);
function remove(child);
function getChild(index);
}
interface fromItem{
function save();
}
*/
var CompositeForm = function(id, method, action){
...
};
CompositeForm.prototype.add = function(){
...
};
CompositeForm.prototype.remove = function(){
...
};
CompositeForm.prototype.getChild = function(){
...
};
CompositeForm.prototype.save = function(){
...
};

这种方法没有确保对象真正实现了正确的方法集而进行检查,也不会抛出错误以告知程序中有问题。

用属性检查模仿接口

/*
interface Composite{
function add(child);
function remove(child);
function getChild(index);
}
interface fromItem{
function save();
}
*/
var CompositeForm = function(id, method, action){
this.implementsInterfaces = ['Composite', 'FormItem']; //声明自己继承的接口
...
};
...
function addForm(formInstance){
if(!implements(formInstance, 'Composite', 'FormItem')){ //检查实例formInstance是否实现了接口
throw new Error('Object does not implement a required interface');
}
}
function implements(object){ //检查算法,双重循环
for(var i=1; i<arguments.length; i++){
var interfaceName = arguments[i];
var interfaceFound = false;
for(var j=0; j<object.implementsInterfaces.length; j++){
if(object.implementsInterfaces[j] == interfaceName){
interfaceFound = true;
break;
}
}
if(!interfaceFound){
return false;
}
}
return true;
}

这种做法是只知其表不知其里。

用鸭式辨型模仿接口

类是否声明自己支持哪些接口并不重要,只要它具有这些接口中的方法就行。

var Composite = new Interface('Composite', ['add', 'remove', 'getChild']); //声明接口拥有的方法
var FormItem = new Interface('FormItem', ['save']); //声明接口拥有的方法 var compositeForm = function(id, method, action){//implements Composite, FormItem
...
};
...
function addForm(formInstance){
ensureImplements(formInstance, Composite, formItem);
...
} //Constructor
var Interface = function(name, methods){ //将接口的方法保存在this.methods中用以将来的检测
if(arguments.length != 2){
throw new Error('Interface constructor called with '+arguments.legth+
" arguments, but exected exactly 2.");
} this.name = name;
this.methods = [];
for(var i=0, len = methods.length; i<len; i++){
if(typeof methods[i] !== 'string'){
throw new Error('Interface constructor expects method names to be passed in as a string.');
}
this.methods.push(methods[i]);
}
};
Interface.ensureImplements = function(object){
if(arguments.length < 2){
throw new Error('Function Interface.ensureImplements called with'+arguments.length+
"arugments, but expected at least 2.");
}
for (var i=0, len=arugments.length; i<len; i++){
var intf = arguments[i];
if(intf.constructor !== Interface){
throw new Error('Function Interface.ensureImplements expects arguments'+
"two and above to be instances of Interface.");
}
for(var j=0; methodsLen = intf.methods.length; j<methodsLen; j++){ //通过methods检查实例是否实现了接口
if(!object[method] || typeof object[method]!=='function'){
throw new Error('Function Interface.ensureImplements:object'+
" doesnot implement the"+intf.name+
" interface. Method"+method+" was not found!");
}
}
}
};

嗯,这个方法还正规一点。但是要借助其它两个类,也没有声明自己实现哪了些接口,降低了重用性。

一个例子

这个例子确保我们在调用对象的方法时,它已经实现了相应的接口的方法。

var DynamicMap = new Interface('DynamicMap', ['centerOnPoint', 'zoom', 'draw']);
function displayRoute(mapInstance){
Interface.ensureImplements(mapInstance, DynamicMap);
mapInstance.centerOnPoint(12,34);
mapInstance.zoom(5);
mapInstance.draw();
...
}

JS设计模式——2.初识接口的更多相关文章

  1. js 设计模式-接口

    js模拟java接口检测函数:确保子类实现接口中的方法:(出自js设计模式) 上代码: <script type="text/javascript" > <%-- ...

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

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

  3. 读书笔记:js设计模式

    面向过程编程,面向对象编程和函数式编程> 定义一个类方法1:function Anim(){ } Anim.prototype.start = function(){ .. };Anim.pro ...

  4. js设计模式总结1

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

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

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

  6. JS设计模式(一)

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

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

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

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

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

  9. js设计模式系列之(一)请节约你的请求-代理模式

    What’s the proxy pattern? 代理模式其实就是将违反单一性原则的类给抽离出来,尽量满足开放和封闭的原则. 相当于一个类的行为只是一种,但是你可以给这个类添加额外的行为.比如: 一 ...

随机推荐

  1. [转帖]IBM收购Red Hat

    来源cnbeta:https://www.cnbeta.com/articles/tech/782009.htm 2018年10月28 日,IBM 宣布收购 Linux 巨头 Red Hat.公告中称 ...

  2. ASP.NET 页面访问控制

    request常用对象和方法: @属性:1.quary string,获取通过URL路径传来的数据 2.Form,获取通过表单提交传输的数据 3.servervariables,获取Web服务器变量的 ...

  3. phpisset()和empty()函数区别

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  4. ubuntu下搭建openGL环境

    1.      建立基本编译环境 sudo apt-get install build-essential 2.      安装OpenGL Library sudo apt-get install ...

  5. HDU4647_Another Graph Game

    有趣的博弈题. 关键在于把比边权的平分到两边的点权上面,然后点权排序,每次从大的开始拿就可以了. #include <iostream> #include <cstdio> # ...

  6. SPOJ3713——Primitive Root

    终于有一个SPOJ题目是我自己独立做出来的,ORZ,太感动了. 题目意思是给你一个素数,问你一个数r是否满足,r,r^2,r^3,……,r^p-1,全不相同. 以前做过这种类型的题目额.是这样的. 根 ...

  7. bzoj4639 博士的选取器

    题意 给出一个长度为n的正整数序列,要求把它划分成若干个连续的区间,使得每个区间的数字之和都不超过给定的lim.最后的代价等于每个区间的最大值之和.求最小代价.n<=300000 分析 定义f[ ...

  8. MySQL复制 -- 应用场景

    本文行文路径如下: 什么是复制?复制是怎么工作的?复制有哪几种表现形式?复制能解决那些问题?业界有哪些数据同步解决方案? 什么是复制? 官方解释道:Replication enables data f ...

  9. 【刷题】洛谷 P3806【模板】点分治1

    题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接 ...

  10. BZOJ 1070 修车 【费用流】

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...