深入理解JavaScript系列(31):设计模式之代理模

代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下:

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

代理模式使得代理对象控制具体对象的引用。代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西。

正文

我们来举一个简单的例子,假如dudu要送酸奶小妹玫瑰花,却不知道她的联系方式或者不好意思,想委托大叔去送这些玫瑰,那大叔就是个代理(其实挺好的,可以扣几朵给媳妇),那我们如何来做呢?

复制代码 代码如下:


// 先声明美女对象
var girl = function (name) {
    this.name = name;
};

// 这是dudu
var dudu = function (girl) {
    this.girl = girl;
    this.sendGift = function (gift) {
        alert("Hi " + girl.name + ", dudu送你一个礼物:" + gift);
    }
};

// 大叔是代理
var proxyTom = function (girl) {
    this.girl = girl;
    this.sendGift = function (gift) {
        (new dudu(girl)).sendGift(gift); // 替dudu送花咯
    }
};

调用方式就非常简单了:

复制代码 代码如下:


var proxy = new proxyTom(new girl("酸奶小妹"));
proxy.sendGift("999朵玫瑰");

实战一把

通过上面的代码,相信大家对代理模式已经非常清楚了,我们来实战下:我们有一个简单的播放列表,需要在点击单个连接(或者全选)的时候在该连接下方显示视频曲介绍以及play按钮,点击play按钮的时候播放视频,列表结构如下:

复制代码 代码如下:


<h1>Dave Matthews vids</h1>
<p><span>全选/反选</span></p>
<ol>
  <li><input type="checkbox" checked><a href="https://new.music.yahoo.com/videos/--2158073">Gravedigger</a></li>
  <li><input type="checkbox" checked><a href="https://new.music.yahoo.com/videos/--4472739">Save Me</a></li>
  <li><input type="checkbox" checked><a href="https://new.music.yahoo.com/videos/--45286339">Crush</a></li>
  <li><input type="checkbox" checked><a href="https://new.music.yahoo.com/videos/--2144530">Don't Drink The Water</a></li>
  <li><input type="checkbox" checked><a href="https://new.music.yahoo.com/videos/--217241800">Funny the Way It Is</a></li>
  <li><input type="checkbox" checked><a href="https://new.music.yahoo.com/videos/--2144532">What Would You Say</a>
</li>
</ol>

我们先来分析如下,首先我们不仅要监控a连接的点击事件,还要监控“全选/反选”的点击事件,然后请求服务器查询视频信息,组装HTML信息显示在li元素的最后位置上,效果如下:

深入理解JavaScript系列(31):设计模式之代理模

然后再监控play连接的点击事件,点击以后开始播放,效果如下:

深入理解JavaScript系列(31):设计模式之代理模

好了,开始,没有jQuery,我们自定义一个选择器:

复制代码 代码如下:


var $ = function (id) {
    return document.getElementById(id);
};


由于Yahoo的json服务提供了callback参数,所以我们传入我们自定义的callback以便来接受数据,具体查询字符串拼装代码如下:

复制代码 代码如下:


var http = {
    makeRequest: function (ids, callback) {
        var url = 'http://query.yahooapis.com/v1/public/yql?q=',
            sql = 'select * from music.video.id where ids IN ("%ID%")',
            format = "format=json",
            handler = "callback=" + callback,
            script = document.createElement('script');

sql = sql.replace('%ID%', ids.join('","'));
            sql = encodeURIComponent(sql);

url += sql + '&' + format + '&' + handler;
            script.src = url;

document.body.appendChild(script);
    }
};

代理对象如下:

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgfgxf.html