代理模式 作用:節制或延遲對象的加載;
說白了,當我用到這個 對象的方法 的時候,纔會去創建該 對象。
代碼實例:
// 代理對象:代理也是對象,他的目的就是爲了節制(控制)對本體對象的訪問;
// 圖書館(本體對象,實例化圖書館需要消耗很多的資源)
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