javascript設計模式-代理模式(11)
阿新 • • 發佈:2018-12-25
代理(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);