这段时间一直在做iOS开发,对Web前端也生疏了不少。不过,代码的思想都是相通的,在学习不同的语言和框架的同时,经常去做思考和比较,会有很多不一样的发现
委托模式,顾名思义就是交给别人去做,自己不关心做的细节,只给出一个“如何做”的框架。Cocoa的核心设计模式就是委托(delegate)模式,并使用协议来实现委托。我们最常使用到的UITableView
拥有两个委托,UITableViewDelegate
和UITableViewDataSource
,前者负责交互,后者负责提供数据,UITableVIew
本身不关注实现的细节,只提供需要实现的协议,这样就达到了解耦的目的。光这么说,很多人可能还是不能理解委托模式,所以这里以javascript为例,通过一个例子详细阐述委托模式。
有一个跨国公司,他们经营了很多门生意,由于是跨国公司,他们的生意都需要翻译来协助完成。而这个公司自己并没有相应的翻译部门,所以他委托给能够提供翻译服务的人。
我们把这个翻译的服务用BusinessProtocol
中的translate
方法表示
var BusinessProtocol = {
translate:function(source) {
return source;
}
};
可以看到,默认的translate方法接收一个翻译的源,并直接返回这个源,相当于没有翻译。没办法,谁叫这个跨国公司这么low,连翻译部门都没有呢。。。
接着,我们把生意用Business
表示
function Business(BusinessDelegate, communication) {
if (BusinessDelegate == undefined || BusinessDelegate.translate == undefined) {
this.BusinessDelegate = BusinessProtocol;
} else {
this.BusinessDelegate = BusinessDelegate;
}
this.communication = communication;
this.doBusiness = function() {
var that = this;
this.communication.forEach(function(e){
var translatedWord = that.BusinessDelegate.translate(e);
alert(translatedWord);
});
//do other business...
}
}
这个Business
对象接受一个委托对象BusinessDelegate
和一个对话参数communication,并做一个判断,如果这个BusinessDelegate不为空且拥有我们刚才定义的翻译服务translate
,则把自身的this.BusinessDelegate
设置为传入的 BusinessDelegate
,否则设置为之前拥有默认translate
方法的BusinessProtocol
。这笔生意当然有需要翻译的对话,就是传入的对话参数communication,赋值给 this.communication
。然后自然又一个谈生意的方法,用this.doBusiness
表示。这个方法里面就调用了this.BusinessDelegate
的translate
方法,完成谈生意时候的翻译工作,并把翻译的内容说(alert)出来。当然谈生意的过程还可能有其他的事情,大保健什么的我就不说了,嘿嘿...
这时候,就轮到我们的翻译员出场了,首先出场的是中文翻译ChineseTranslater
function ChineseTranslater() {
var dictionray = {
"hello":"你好",
"world":"世界"
};
this.translate = function(source) {
return dictionray[source];
};
}
我们可以看到,这个中文翻译是浑水摸鱼的,他什么都不会,就靠着身上的一本字典dictionary
,这本字典上还只有两个词的翻译,我们不禁为他捏一把汗。他的翻译工作translate
就是查阅字典,把词对应的翻译返回。
接下来出场的是白痴翻译员IdoitTranslater
。
function IdoitTranslater() {
this.translate = function(source) {
return "I'm a idoit!";
};
}
你没有看错,他就是一个白痴。。。对于需要翻译的任何话,他就只会返回 "I'm a idoit!"。
最后,终于要到了激动人心的谈生意时候了
var businessA = new Business(new ChineseTranslater(),["hello","world"]);
businessA.doBusiness();
var businessB = new Business(new IdoitTranslater(),["hello","world"]);
businessB.doBusiness();
var businessC = new Business(undefined,["hello","world"]);
businessC.doBusiness();
中文翻译躲过一劫,成功的翻译出了“你好”,“世界”,生意A算是谈下去了。
生意B表示我想静静...
生意C表示,老板带着小姨子跑了,没钱请翻译了...
看完这个故事,我们就能大致理解委托模式在javascript中的实现。喜欢的童鞋点个喜欢~
网友评论