js设计模式--代理模式

/*定义:
代理是一个对象,它可以控制另一个对象的访问,
它与另外哪个对象实现了同样的接口,
并且会把任何方法调用传递给哪个对象。
注意:
	代理只是控制对另一个对象的访问,
	不会像装饰者那样添加或者修改另一个对象的方法;
	也不会像门面模式那样简化那个对象的接口;
*/


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);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值