JavaScript设计模式学习之二
博客专区 > iPhone 的博客 > 博客详情
JavaScript设计模式学习之二
iPhone 发表于3年前
JavaScript设计模式学习之二
  • 发表于 3年前
  • 阅读 38
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: JS设计模式之接口实现之二

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'))

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

共有 人打赏支持
粉丝 0
博文 7
码字总数 2946
×
iPhone
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: