javascript设计模式17装饰者

装饰者模式的作用是为对象动态添加职责,在js中,也可以为函数动态添加职责,为函数添加职责,通过AOP来实现。

var plane = {
	fire:function(){
		console.log('发射子弹')
	}
}

var missileDecorator = function(){
	console.log("发射子弹")
}

var atomDecorator = function(){
	console.log('发射原子弹')
}

var fire = plane.fire;
// 为对象添加了发射导弹的功能
plane.fire = function(){
	fire();
	missileDecorator();
}

//通过AOP方式实现
Function.prorotype.before = function(fn){
	var _self = this;
	return function(){
		fn.apply(this,arguments)
		return _self.apply(this,arguments)
	}
}

Function.prototype.after = function(fn){
	var _self = this;
	return function(){
		var ret = _self.apply(this,arguments)
		fn.apply(this,arguments)
		return ret;
	}
}

///通过AOP实现插件式表单验证
function formSubmit(){
	validator();
	ajax();
}

function validator(){
	//验证逻辑 balabala
	return true;
}
formSubmit()

//submit函数承担了两个职责,函数臃肿,职责混乱,没有可复用性。
//使用AOP重构
function formSubmit(){
	ajax();
}
formSubmit.before(validator)
formSubmit()

  装饰者模式和代理模式的区别

  装饰者模式和带来模式结构看起来非常相像,两种模式都描述了怎样为对象提供一定程度上的间接引用,实现部分都保留了对另外一个对象的引用。

所以区别它们的关键在它们的意图和设计目的。代理模式目标是,当直接访问本体不方便或者不符合需要时,为本体提供一个替代者。

而装饰者着眼为为对象动态加入行为。

代理强调一种关系,proxy和它实体之间的关系,这种关系是一种静态关系,在设计之初可能已经确定。

装饰者强调的一开始可能并不能完全确定对象的全部功能,在后续为对象增加功能时,采用包装一层的方式。

posted @ 2016-02-24 11:02  倾其一生  阅读(130)  评论(0)    收藏  举报