文档章节

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设计模式之观察者模式

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

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

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

小钱钱阿圣
2017/09/22
0
0
你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人
06/02
0
0
JavaScript 中常见设计模式-单例模式

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

webstack前端栈
05/19
0
0
js策略模式《JavaScript设计模式与开发实践》阅读笔记

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-封闭原则,将一个个算法(解决方...

RoyLuo
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
39分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
19
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
949
16
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部