所谓命令模式,就是解耦了命令发送者与命令接收者,何谓命令发送者,何谓命令接收者,举个例子,我点击一个按钮,一个div变红,命令发送者就是按钮,接收者就是div。当然这是简单的例子,为什么要解耦,好处就是解耦了各个对象的联系。
比如现在有个对象,对象看起来是这样写的:
var people={ name:"liyong", sayName:function(){ alert(this.name); } }
那我们如何在一个按钮上绑定事件,点击按钮后调用sayName方法,并且要弹出liyong,之前也写过的,利用bind,可以这么做:
button.addEventListener("click",people.sayName.bind(people),false);
这样写明显把button和people两个对象耦合在一起了,那如果我现在点击一个按钮,要弹出两个人的名字呢,那我们必须得这样做了:
var People=function(name){ this.name=name; } People.prototype.sayName=function(){ alert(this.name); } var createCommand=function(){ var args=Array.prototype.slice.call(arguments,0); return { sayName:function(){ for(var i=0,people;people=args[i++];){ people.sayName(); } } } } var people1=new People("liyong1"); people2=new People("liyong2"); command=createCommand(people1,people2), button=document.getElementById("div1") button.addEventListener("click",command.sayName,false);
我们不用创建了一个命令函数,而解耦了命令接收者与命令发送者之间的耦合关系,我们调用的时候只需要执行函数就行了,而不需要知道这个函数由哪个对象来具体负责执行,这是非常好的。我们可以把这些命令缓存起来,需要的时候执行就行了。就像在linux中我们敲命令的时候:
比如要创建一个文件夹,我们用:mkdir
要打开一个文本文件,我们用:vi
那我们可以用一个bat文件把这些执行命令存起来,想执行的时候直接执行就行了,不用管这些命令具体是由谁执行的,我们只需要发送命令就行了。
其实在js中,所谓命令模式,只是把这些执行过程封装在一个函数中,调用的时候可以用people.sayName()的方式,这样就能让sayName方法找到自己的this。
好了,今天就讲到这里吧!
时间: 2024-10-11 02:57:03