美文网首页程序员
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