12-JavaScript設計模式——代理模式

代理模式 作用:節制或延遲對象的加載;

說白了,當我用到這個 對象的方法 的時候,纔會去創建該 對象


代碼實例:

// 代理對象:代理也是對象,他的目的就是爲了節制(控制)對本體對象的訪問;

// 圖書館(本體對象,實例化圖書館需要消耗很多的資源)
var LibraryInterface = new JG.Interface('LibraryInterface', ['addBook', 'findBook', 'checkoutBook', 'returnBook']);

// 代理對象和本體對象應該實現同一接口

var Book = function(id, title, author){
  this.id = id;
  this.title = title;
  this.author = author;
};

// 本體對象
var Library = function(books){
  this.books = books;
};

Library.prototype = {
  constructor : Library,
  addBook : function(book){
    this.books[book.id] = book;
  },
  findBook : function(id){
    if(this.books[id]){
      return this.books[id];
    }
    return null;
  },
  // 借書
  checkoutBook : function(id){
    // 電腦登記...交押金(僞代碼)
    return this.findBook(id);
  },
  // 還書
  returnBook : function(book){
    // 電腦登記(已還)...計算費用(僞代碼)
    this.books[book.id] = book;
  }
};

// 圖書館的代理對象
var LibraryProxy = function(books){
  this.books = books;
  this.library = null;// 定義一個空對象
};

LibraryProxy.prototype = {
  constructor : LibraryProxy,
  // 初始化本體對象的函數
  initLibrary : function(){
    if(!this.library){
      this.library = new Library(this.books);
    }
  },
  addBook : function(book){
    this.initLibrary();
    this.library.addBook(book);
  },
  findBook : function(id){
    this.initLibrary();
    if(this.library.books[id]){
      return this.library.books[id];
    }
    return null;
  },
  // 借書
  checkoutBook : function(id){
    this.initLibrary();
    // 電腦登記...交押金(僞代碼)
    return this.library.findBook(id);
  },
  // 還書
  returnBook : function(book){
    this.initLibrary();
    // 電腦登記(已還)...計算費用(僞代碼)
    this.library.books[book.id] = book;
  }
};

// 實例化的是代理對象,推遲本體對象實例化的時間
var proxy = new LibraryProxy({
  '01':new Book('01', 'java', 'zhangSan'),
  '02':new Book('02', 'js', 'liSi')
});
alert(proxy.findBook('02').title);// js


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章