stay hungry stay foolish

Javascript设计模式(代理模式)

代理模式的目的就是为了节制(控制)对本体对象的访问,代理对象和本体对象都实现了相同的接口。代理模式可以用来延迟对象的初始化,增强加载速度。

实例:

假设有一个书店对象,其有很多业务,加载这个书店对象需要消耗大量内存,如果程序一开始就初始化这个对象,可能会耗费珍贵的加载时间,而且真正的购买动作往往是用户选购很长时间后才发生,这时我们就可以实现一个代理对象来完成业务逻辑,等到业务正真发生时再去初始化书店对象。

var Book = function(name,year,type,num){
	this.name = name;
	this.year = year;
	this.type = type;
	this.num = num;
}
Book.prototype.toString = function(){
	return this.name+','+this.year+','+this.type;
}
//假设BookStore是一个很大的对象
var BookStore = function(){
	this.books = [];
}
BookStore.prototype = {
	constructor: BookStore,
	sellBook: function(name,year,type){
		var book = this.findBook(name,year,type);
		if(book && book.num>1){
			book.num--;
			return book;
		}else{
			return null;
		}
	},
	addBook: function(name,year,type){
		this.books[name+year+type] = new Book(name,year,type,10000);
	},
	findBook: function(name,year,type){
		return this.books[name+year+type];
	}
	//其他的业务
}
//需要提供一个代理对象来延迟BookStore的初始化,真正用到的时候再加载,以提供程序的性能
BookStoreProxy = function(){}
BookStoreProxy.prototype = {
	constructor: BookStoreProxy,
	initialBookStore: function(){
		if(!this.bookStore){
			this.bookStore = new BookStore();
		}
	},
	sellBook: function(name,year,type){
		this.initialBookStore();
		return this.bookStore.sellBook(name,year,type);
	},
	addBook: function(name,year,type){
		this.initialBookStore();
		this.bookStore.addBook(name,year,type);
	},
	findBook: function(name,year,type){
		this.initialBookStore();
		return this.bookStore.findBook(name,year,type);
	}
	//其他的业务
}
var bookStoreProxy = new BookStoreProxy();
bookStoreProxy.addBook('JavaScript',2017,'软件');
bookStoreProxy.addBook('唐诗',2017,'文学');
bookStoreProxy.addBook('高数',2017,'数理化');
console.log(bookStoreProxy.sellBook('JavaScript',2017,'软件').toString());