1. 程式人生 > >javascript設計模式-代理模式(11)

javascript設計模式-代理模式(11)

代理(proxy)是一個物件,它可以用來控制對一個物件的訪問。它與另外那個物件實現了同樣的介面,並且會把任何方法呼叫傳遞到那個物件。代理模式最基本的形式是對訪問進行控制,代理物件所做的不外乎節制對本地的訪問,它不會新增方法或修改方法,也不會簡化介面。它實行的介面與本體完全相同,所有對它進行的方法呼叫都會被傳遞給本地

//代理模式(proxy):代理也是物件,他的目的就是為了節制(控制)對本體物件的訪問

var LibraryInterface = new BH.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) { alert('產生代理物件,但是並沒有產生真正的本體物件!'); this.books = books; this.library = null; //定義一個空物件 }; LibraryProxy.prototype = { constructor: LibraryProxy, initializeLibrary: function() { if (this.library == null) { alert('真正的本體物件!'); this.library = new Library(this.books); } }, addbook: function(book) { this.initializeLibrary(); //實際上具體做事情的還是本體物件自己本身 this.library.addbook(book); }, findbook: function(id) { this.initializeLibrary(); return this.library.findbook(id); }, checkoutbook: function(id) { this.initializeLibrary(); return this.findbook(id); }, returnbook: function(book) { this.initializeLibrary(); this.library.returnbook(book); } }; //例項化的是代理物件:推遲本體物件例項化的時間,什麼時候具體去做事情了,再去例項化它 // hibernate: get(全查詢出來) load(返回代理物件) var proxy = new LibraryProxy({ "01": new Book('01', 'java', 'z3'), "02": new Book('02', 'js', 'z4') }); alert(proxy.findbook('01').title);