/*定义:
代理是一个对象,它可以控制另一个对象的访问,
它与另外哪个对象实现了同样的接口,
并且会把任何方法调用传递给哪个对象。
注意:
代理只是控制对另一个对象的访问,
不会像装饰者那样添加或者修改另一个对象的方法;
也不会像门面模式那样简化那个对象的接口;
*/
var Publication=new Interface("Publication",['getIsbn','setIsbn'
,'getTitle','setTitle','getAuthor','setAuthor','display']);
var Book=function(isbn,title,author){...}
var Library=new Interface("Library",['findBooks','checkoutBook','returnBook']);
var PublicLibrary=function(books){
this.catalog={};
for(var i=0;i<books.length;i++){
this.catalog[books[i].getIsn()]={book:books[i],available:true};
}
};
PublicLibrary.prototype={
findBooks:function(searchString){
var results=[];
for(var isbn in this.catalog){
if(!this.catalog.hasOwnProperty(isbn)){
continue;
}
if(searchString.match(this.catalog[isbn].getTitle)||
searchString.mathc(this.catalog[isbn].getAuthor)){
results.push(this.catalog[isbn]);
}
}
return results;
},
checkoutBook:function(book){
var isbn=book.getIsbn();
if(this.catalog[isbn]){
if(this.catalog[isbn].available){
this.catalog[isbn].available=false;
return this.catalog[isbn];
}else{
throw new Error('PublicLibrary:book '+book.getTitle()+ ' is not currently available');
}
}else{
throw new Error('PublicLibrary:book '+book.getTitle()+ ' not found');
}
},
returnBook:function(book){
var isbn=book.getIsbn();
if(this.catalog[isbn]){
this.catalog[isbn].available=true;
}else{
throw new Error('PublicLibrary:book '+book.getTitle()+ ' not found');
}
}
}
/*虚拟代理:
用于控制对那种创建开销很大的本体的访问,
它会把本体的实例化推迟到有方法调用的时候.
使用场景:
如果有些类或者对象需要使用大量的内存保存数据,
而你并不需要在实例化完成后理解访问这些数据,
或者,其构造函数需要大量计算,那就应该使用虚拟代理,
将设置开销的产生推迟到正真需要数据的时候*/
var PublicLibraryVirtualProxy=function(catalog){
this.library=null;
this.catalog=catalog;
};
PublicLibraryVirtualProxy.prototype={
_initLibrary:function(){
if(this.library===null){
this.library=new PublicLibrary(this.catalog);
}
},
findBooks:function(searchString){
this._initLibrary();
return this.library.findBooks(searchString);
},
checkoutBook:function(book){
this._initLibrary();
return this.library.checkoutBook(book);
},
returnBook:function(book){
this._initLibrary();
return this.library.returnBook(book);
}
}
js设计模式--代理模式
最新推荐文章于 2024-08-21 23:08:52 发布