文档章节

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
JavaScript 中常见设计模式-单例模式

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

webstack前端栈
05/19
0
0
你需要了解的23种JavaScript设计模式

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

java高级架构牛人
06/02
0
0
js策略模式《JavaScript设计模式与开发实践》阅读笔记

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

RoyLuo
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊clean code

clean code,顾名思义就是整洁的代码,或者说清晰、漂亮的代码,相信大多数工程师都希望自己能写出这样的代码。 也许这是个千人千面的话题,每个工程师都有自己的理解。比如我,从一个天天被...

Skqing
28分钟前
3
0
redis连接报错—— (error) NOAUTH Authentication required.

1.redis报认证错误 redis客户端连接成功,但是操作报异常——(error) NOAUTH Authentication required 错误的含义是说你没有认证,说明没有使用密码连接 redis-cli -h 127.0.0.1 -p 6379 -a ...

啊哈关关
34分钟前
2
0
地理位置坐标标准以及转换

/** * 地理位置坐标标准以及转换 * * 1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于W...

葉者
36分钟前
2
0
Generator-ES6

基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装...

简心
54分钟前
6
0
FullCalendar日历插件说明文档

普通显示设置 属性 描述 默认值 header 设置日历头部信息。 如果设置为false,则不显示头部信息。包括left,center,right左中右三个位置,每个位置都可以对应以下不同的配置: title: 显示当...

ada_young
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部