文档章节

JavaScript设计模式学习之二

iPhone
 iPhone
发布于 2015/04/08 15:09
字数 717
阅读 38
收藏 0

JS设计模式之接口实现之二

//在这里我们需要给没有实现接口方法的类(Function)提供错误信息
// 还是刚刚那个接口
/*
interface Composite{
	function add(child);
	function remove(child);
	function getChild(index);
}

interface FormItem{
	function save();
}
*/
//这里用到的方法叫属性检查。在实例化类(Function)时检查是否实现了方法
var CompositeForm=function(id,data){
	//号称自己实现了接口
	this.implementsInterface=['Composite','FormItem'];
	this.id=id;
	this.data=data
}
var findchild=function (_array,child) {
	for(var i=0;i<_array.length;i++){
		if(_array[i]===child)
			return i;
	}
	return null;
}

CompositeForm.prototype.add=function(child){
	this.data.push(child);
	return this.data;
}
CompositeForm.prototype.remove=function(child){
	var index=findchild(this.data,child)
	if(index){
		this.data.splice(index,1);
	}
    return this.data;
}
CompositeForm.prototype.getChild=function(index){
	return this.data[index];
}
CompositeForm.prototype.save=function(){
	console.log("save");
}

function log(obj){
	console.log(obj);
}

//上面的代码跟上interface.js的代码相比只是在定义实现类的开头号称自己实现了Composite和FormItem接口,其他没变,
//有了这个声明之后,在这个类实例化后都可以对该实例进行属性检查,如果检查该实例没有实现相应的异常,例如:
// 实例化:
var form=new CompositeForm(1,[1,'hello','world',{asd:"123"}]);
// 接下来,我们认为它实现了Composite中add方法,这次我们需要把实例当做参数来使用,所以我们可以这样做:
var addForm=function(instance,child){
	//检查_from的implementsInterface属性看它是否实现了接口方法,当然啦,检查方法自己实现
	if(!implements(instance,'Composite','FormItem'))
		throw new Error("Object does not implement a required interface");
	return instance.add(child);
}

//下面是implements方法,方法规定第一个为类实例,后面参数为传入的参数,参数使用arguments
function implements(){
	var instance=arguments[0];
	for(var i=1;i<arguments.length;i++){
		var interfaceName=arguments[i];
		var interfaceFound=false;
		for(var j=0;j<instance.implementsInterface.length;j++){
			if(instance.implementsInterface[j]===interfaceName){
				//如果找到则退出本次循环,
				interfaceFound=true;
				break;
			}
		}
		//在这次循环结束的时候检查interfaceFound值是否为true,如果不为true则说明实例没有实现该接口
		if(!interfaceFound){
			return false;
		}
	}
	return true;
}

//接下来是测试,我们认为Composite实现了add方法且按规定我们定义了调用add的addForm方法
// log(form.implementsInterface)
log(addForm(form,'测试'));

在addForm方法中,检查熟悉方法如果写成

if(!implements(instance,'Composite','FormItem','Haha'))

运行结果:

在实际运行过程中,我们并不需要对实例的没过接口进行检查,只需要检查用到的方法所对应的接口即可,这里只使用了add方法,所以语句可以改写成

if(!implements(instance,'Composite'))

好吧,这里并不能检查到底是漏了那个接口,这是一方面,但另一方面,这种实现方式还是人为书面声明,但具体有没有真的去实现那些方法我们还是不得而知,但相比上一篇的方法,多了一些强制性和人性化的警告

© 著作权归作者所有

共有 人打赏支持
iPhone
粉丝 0
博文 7
码字总数 2946
作品 0
海口
私信 提问
JavaScript 中常见设计模式-单例模式

     单例模式两个条件   确保只有一个实例   可以全局访问   适用   适用于弹框的实现,全局缓存   实现单例模式      JavaScript 中的单例模式   因为 JavaScript 是无...

webstack前端栈
05/19
0
0
Javascript设计模式与开发实践详见(一:单例模式)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设...

littl_Prince
2016/04/05
0
0
JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian
05/22
0
0
JavaScript设计模式系列三之单例模式(附案例源码)

文章初衷 设计模式其实旨在解决语言本身存在的缺陷 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什...

小钱钱阿圣
2017/09/22
0
0
JS单例模式《JavaScript设计模式与开发实践》阅读笔记

此文仅记录本人阅读《JavaScript设计模式与开发实践》这个本时的感受,感谢作者曾探写出这么好的一本书。如有冒犯,如有错误,请联系本人:luogao_lg@sina.com处理。 这一章让我知道了单例模...

RoyLuo
05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基于 Docker 快速部署多需求 Spark 自动化测试环境

引言 在进行数据分析时,Spark 越来越广泛的被使用。在测试需求越来越多、测试用例数量越来越大的情况下,能够根据需求快速自动化部署 Spark 环境、快速完成所有测试越来越重要。 本文基于 ...

呐呐丶嘿
13分钟前
0
0
支付宝APP支付之查看支付宝商户ID

1、登录支付宝蚂蚁金服开放平台 2、查看账号详情,选择合作伙伴管理,账户管理,查看角色身份,此处的PID就是商户ID 3、点击秘钥管理,可查看绑定的相关应用及其APPID等信息

Code辉
16分钟前
0
0
崛起于Springboot2.X之通讯WebSocket(40)

技术简介:Springboot2.0.3+freemaker+websocket 1、添加pom依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

木九天
25分钟前
1
0
Java常用四大线程池用法以及ThreadPoolExecutor详解

为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中...

孟飞阳
27分钟前
1
0
Netty+Websocket 实现一个简易聊天室

后台代码 /** * 服务端 */public class ChatServer {public static void main(String[] args) throws Exception {int port=8080; //服务端默认端口new ChatServer().bind...

这很耳东先生
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部