美文网首页程序员
javascript设计模式之委托模式

javascript设计模式之委托模式

作者: 文兴 | 来源:发表于2016-04-28 20:11 被阅读616次

这段时间一直在做iOS开发,对Web前端也生疏了不少。不过,代码的思想都是相通的,在学习不同的语言和框架的同时,经常去做思考和比较,会有很多不一样的发现

委托模式,顾名思义就是交给别人去做,自己不关心做的细节,只给出一个“如何做”的框架。Cocoa的核心设计模式就是委托(delegate)模式,并使用协议来实现委托。我们最常使用到的UITableView拥有两个委托,UITableViewDelegateUITableViewDataSource,前者负责交互,后者负责提供数据,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.BusinessDelegatetranslate方法,完成谈生意时候的翻译工作,并把翻译的内容说(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中的实现。喜欢的童鞋点个喜欢~

相关文章

网友评论

    本文标题:javascript设计模式之委托模式

    本文链接:https://www.haomeiwen.com/subject/vevcrttx.html