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

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

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

      觀察者模式的一個例子

      觀察者模式(有時又被稱為發布-訂閱模式、模型-視圖模式、源-收聽者

      模式或從屬者模式)是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依于它的觀察者物件,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實作事件處理系統。

      觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個例子,用戶界面可以作為一個觀察者,業務數據是被觀察者,用戶界面觀察業務數據的變化,發現數據變化后,就顯示在界面上。面向對象設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。
      下面,我是在他人基礎上做的一個封裝以及簡單繼承。
      <!DOCTYPE html>
      <html>
      <head>
          <title></title>
          <meta charset="utf-8"/>
      </head>
      <body>
      <button id="sendWeekly">發送周報</button>
      <button id="sendDaily">發送日報</button>
      <script>
          var inherits = function (ctor, superCtor) {
              // 顯式的指定父類
              ctor.super_ = superCtor;
              superCtor = typeof superCtor === "function" ? superCtor.prototype : superCtor;
              // ECMAScript 5  原型式繼承并解除引用
              if (Object.create) {
                  ctor.prototype = Object.create(superCtor, {
                      constructor:{
                          value:ctor,
                          enumerable:false,
                          writable:true,
                          configurable:true
                      }
                  });
              } else {
                  // 無Object.create方法的平穩退化
                  function F() {
                  };
                  F.prototype = superCtor;
                  ctor.prototype = new F();
                  ctor.prototype.constructor = ctor;
              }
          };
      
          var Observer = (function (W) {
              var pubsub = function () {
                  this.topics = {};
                  this.subUid = -1;
              };
      
              // 發布方法
              pubsub.prototype.fire = function (type) {
                  var args = [].slice.call(arguments, 1),
                          that = this;
                  if (!this.topics[type]) {
                      return false;
                  }
                  (function () {
                      var subscribers = that.topics[type],
                              len = subscribers ? subscribers.length : 0;
      
                      while (len--) {
                          subscribers[len].func.apply(that, args);
                      }
                  })();
      
                  return true;
              };
              //訂閱方法
              pubsub.prototype.on = function (type, fn) {
                  if (!this.topics[type]) {
                      this.topics[type] = [];
                  }
      
                  var token = (++this.subUid).toString();
                  this.topics[type].push({
                      token:token,
                      func:fn
                  });
                  return token;
              };
              //退訂方法
              pubsub.prototype.off = function (type, token) {
                  var evT;
                  if (type === void 0) {
                      return this.topics = {}
                  }
      
                  if (arguments.length == 1) {
                      if (!this.topics[type]) {
                          return;
                      }
                      return delete this.topics[type];
                  }
                  evT = this.topics[type];
                  for (var i = 0, j = evT.length; i < j; i++) {
                      if (evT[i].token === token) {
                          evT.splice(i, 1);
                          return token;
                      }
                  }
                  return false;
              };
              return pubsub;
          }(window));
      
      
          function Paper(name, pages, price) {
              this.name = name;
              this.pages = pages;
              this.price = price;
          }
      
          inherits(Paper, new Observer);
      
          Paper.prototype.send = function (topic) {
              this.fire(topic, {
                  name:this.name,
                  pages:this.pages,
                  price:this.price
              });
          };
      
          function Person(name) {
              var that = this;
              this.name = name;
              this.recive = function (paper) {
                  console.log(that.name + ' recive Pager detail:\n' + 'name:' + paper.name + '\npages:' + paper.pages + '\nprice:' + paper.price)
              }
          }
      
          var person = new Person('Lucy'),
                  person1 = new Person('Tom');
          var Weekly = new Paper('weekly', 298, '$6'),
                  Daily = new Paper('daily', 7, '$0.8');
      
          var pr = Weekly.on('weekly', person.recive),
                  pr1 = Weekly.on('weekly', person1.recive);
          var pr2 = Daily.on('daily', person.recive);
      
          var $ = function (id) {
              return document.getElementById(id);
          }
      
          $('sendWeekly').onclick = function () {
              Weekly.send('weekly');
          }
      
          $('sendDaily').onclick = function () {
              Daily.send('daily');
          }
      </script>
      </body>
      </html>

       

      posted @ 2013-04-02 15:27  穆乙  閱讀(607)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 军人粗大的内捧猛烈进出视频 | 国产国语一级毛片| 国产精品区一区第一页| 亚洲精品人妻中文字幕| 久久一日本道色综合久久| 四虎永久免费精品视频| 无码日韩精品一区二区人妻| 精品亚洲国产成人性色av| 国产不卡一区二区精品| 影音先锋男人站| 国产精品一区二区三区黄色| 国产亚洲精品AA片在线爽| 日本免费一区二区三区| 精品精品久久宅男的天堂| 高清破外女出血AV毛片| 宁晋县| 国产男女黄视频在线观看| 四虎精品视频永久免费| 55夜色66夜色国产精品视频| 亚洲gv天堂无码男同在线观看 | 在线天堂新版资源www在线下载 | 麻豆精品一区二区视频在线| 亚洲高清日韩专区精品| 日韩一区二区黄色一级片| 国产日韩精品一区二区在线观看播放| 日本一区不卡高清更新二区| 色综合色狠狠天天综合网| 久久永久视频| 亚洲日本精品国产第一区| 久爱www人成免费网站| 福贡县| 一区二区三区国产亚洲网站| 中文字幕在线观看亚洲日韩| 免费无遮挡无码视频网站| 久久日产一线二线三线| 国产精品色一区二区三区| 日韩人妻无码精品久久| 人妻中文字幕精品一页| 激情亚洲专区一区二区三区| 午夜福利影院不卡影院| 亚洲色在线v中文字幕|