<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      深入理解JavaScript系列(36):設計模式之中介者模式

      2012-03-13 09:08  湯姆大叔  閱讀(14112)  評論(21)    收藏  舉報

      介紹

      中介者模式(Mediator),用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

      主要內容來自:http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript

      正文

      軟件開發中,中介者是一個行為設計模式,通過提供一個統一的接口讓系統的不同部分進行通信。一般,如果系統有很多子模塊需要直接溝通,都要創建一個中央控制點讓其各模塊通過該中央控制點進行交互。中介者模式可以讓這些子模塊不需要直接溝通,而達到進行解耦的目的。

      打個比方,平時常見的機場交通控制系統,塔臺就是中介者,它控制著飛機(子模塊)的起飛和降落,因為所有的溝通都是從飛機向塔臺匯報來完成的,而不是飛機之前相互溝通。中央控制系統就是該系統的關鍵,也就是軟件設計中扮演的中介者角色。

      我們先用偽代碼來理解一下:

      // 如下代碼是偽代碼,請不要過分在意代碼
      //
      這里app命名空間就相當于扮演中介者的角色
      var app = app || {};

      // 通過app中介者來進行Ajax請求
      app.sendRequest = function ( options ) {
      return $.ajax($.extend({}, options);
      }

      // 請求URL以后,展示View
      app.populateView = function( url, view ){
      $.when(app.sendRequest({url: url, method: 'GET'})
      .then(function(){
      //顯示內容
      });
      }

      // 清空內容
      app.resetView = function( view ){
      view.html('');
      }

      在JavaScript里,中介者非常常見,相當于觀察者模式上的消息Bus,只不過不像觀察者那樣通過調用pub/sub的形式來實現,而是通過中介者統一來管理,讓我們在觀察者的基礎上來給出一個例子:

      var mediator = (function () {
      // 訂閱一個事件,并且提供一個事件觸發以后的回調函數
      var subscribe = function (channel, fn) {
      if (!mediator.channels[channel]) mediator.channels[channel] = [];
      mediator.channels[channel].push({ context: this, callback: fn });
      return this;
      },

      // 廣播事件
      publish = function (channel) {
      if (!mediator.channels[channel]) return false;
      var args = Array.prototype.slice.call(arguments, 1);
      for (var i = 0, l = mediator.channels[channel].length; i < l; i++) {
      var subscription = mediator.channels[channel][i];
      subscription.callback.apply(subscription.context, args);
      }
      return this;
      };

      return {
      channels: {},
      publish: publish,
      subscribe: subscribe,
      installTo: function (obj) {
      obj.subscribe = subscribe;
      obj.publish = publish;
      }
      };

      } ());

      調用代碼,相對就簡單了:

      (function (Mediator) {

      function initialize() {

      // 默認值
      mediator.name = "dudu";

      // 訂閱一個事件nameChange
      // 回調函數顯示修改前后的信息
      mediator.subscribe('nameChange', function (arg) {
      console.log(this.name);
      this.name = arg;
      console.log(this.name);
      });
      }

      function updateName() {
      // 廣播觸發事件,參數為新數據
      mediator.publish('nameChange', 'tom'); // dudu, tom
      }

      initialize(); // 初始化
      updateName(); // 調用

      })(mediator);

      中介者和觀察者

      到這里,大家可能迷糊了,中介者和觀察者貌似差不多,有什么不同呢?其實是有點類似,但是我們來看看具體的描述:
      觀察者模式,沒有封裝約束的單個對象,相反,觀察者Observer和具體類Subject是一起配合來維護約束的,溝通是通過多個觀察者和多個具體類來交互的:每個具體類通常包含多個觀察者,而有時候具體類里的一個觀察者也是另一個觀察者的具體類。

      而中介者模式所做的不是簡單的分發,卻是扮演著維護這些約束的職責。

      中介者和外觀模式

      很多人可能也比較迷糊中介者和外觀模式的區別,他們都是對現有各模塊進行抽象,但有一些微妙的區別。

      中介者所做的是在模塊之間進行通信,是多向的,但外觀模式只是為某一個模塊或系統定義簡單的接口而不添加額外的功能。系統中的其它模塊和外觀模式這個概念沒有直接聯系,可以認為是單向性。

      完整的例子

      再給出一個完整的例子:

      <!doctype html>
      <html lang="en">
      <head>
      <title>JavaScript Patterns</title>
      <meta charset="utf-8">
      </head>
      <body>
      <div id="results"></div>
      <script>
      function Player(name) {
      this.points = 0;
      this.name = name;
      }
      Player.prototype.play
      = function () {
      this.points += 1;
      mediator.played();
      };
      var scoreboard = {

      // 顯示內容的容器
      element: document.getElementById('results'),

      // 更新分數顯示
      update: function (score) {
      var i, msg = '';
      for (i in score) {
      if (score.hasOwnProperty(i)) {
      msg
      += '<p><strong>' + i + '<\/strong>: ';
      msg
      += score[i];
      msg
      += '<\/p>';
      }
      }
      this.element.innerHTML = msg;
      }
      };

      var mediator = {

      // 所有的player
      players: {},

      // 初始化
      setup: function () {
      var players = this.players;
      players.home
      = new Player('Home');
      players.guest
      = new Player('Guest');
      },

      // play以后,更新分數
      played: function () {
      var players = this.players,
      score
      = {
      Home: players.home.points,
      Guest: players.guest.points
      };

      scoreboard.update(score);
      },

      // 處理用戶按鍵交互
      keypress: function (e) {
      e
      = e || window.event; // IE
      if (e.which === 49) { // 數字鍵 "1"
      mediator.players.home.play();
      return;
      }
      if (e.which === 48) { // 數字鍵 "0"
      mediator.players.guest.play();
      return;
      }
      }
      };

      // go!
      mediator.setup();
      window.onkeypress
      = mediator.keypress;

      // 30秒以后結束
      setTimeout(function () {
      window.onkeypress
      = null;
      console.log(
      'Game over!');
      },
      30000);
      </script>
      </body>
      </html>

      總結

      中介者模式一般應用于一組對象已定義良好但是以復雜的方式進行通信的場合,一般情況下,中介者模式很容易在系統中使用,但也容易在系統里誤用,當系統出現了多對多交互復雜的對象群時,先不要急于使用中介者模式,而是要思考一下是不是系統設計有問題。

      另外,由于中介者模式把交互復雜性變成了中介者本身的復雜性,所以說中介者對象會比其它任何對象都復雜。

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 真人无码作爱免费视频| 少妇人妻av无码专区| 婷婷丁香五月亚洲中文字幕| 国产成人无码AV片在线观看不卡| 国产精品视频亚洲二区| 无码国产精品一区二区免费虚拟vr | 在线观看国产成人av天堂| 亚洲av成人久久18禁| 东京热无码国产精品| 成人午夜免费无码视频在线观看| 久久夜色精品国产亚洲a| 欧美日本激情| 亚洲AV无码不卡在线播放| 激情综合网激情激情五月天| 中文字幕在线视频不卡一区二区 | 呼玛县| av无码久久久久不卡网站蜜桃| 蜜桃无码一区二区三区| 下面一进一出好爽视频| 亚洲欧美日韩在线不卡| 国产精品推荐视频一区二区| 国产精品白丝久久AV网站| 久久99精品久久久久久齐齐 | 一二三四中文字幕日韩乱码| 综合激情网一区二区三区| 亚洲不卡av不卡一区二区| 在线天堂中文新版www| 少妇愉情理伦片高潮日本| 亚洲一本大道在线| 国产麻豆md传媒视频| 亚洲欧美自偷自拍视频图片| 国产普通话刺激视频在线播放| 亚洲中文精品一区二区| 日韩精品无码去免费专区 | 谢通门县| 国产综合久久99久久| 日韩av第一页在线播放| 91一区二区三区蜜桃臀| 久久综合97丁香色香蕉| 日本丰满白嫩大屁股ass| 国产精品七七在线播放|