命令模式和外观模式

命令模式,英文名:Command模式。

直接用例子来说明这个模式:

(function(){
	var carManager = {
		requestInfo : function(model, id){

		},
		buyVehicle: function(model, id){

		}
	};
     ...... })()

在上面的代码中,我们定义了一个名为carManager的对象,我们可以通过carManager对象调用它的两个方法。

但是通过命令模式,我们可以这样来调用carManager对象中的方法。

carManager.execute("buyVehicle", "chaojidan", "01");

carManager.execute("requestInfo", "chaojidan", "01");

要实现这种方式的调用,我们需要给carManager添加execute方法,此方法就是把carManager对象中的所有方法进行了抽象处理,变成了调用carManager对象方法的统一接口。

carManager.execute = function(name){
	return carManager[name] && carManager[name].apply(carManager,[].slice.call(arguments,1));
}

这里,我们可以假设传入execute方法中的name为命令名,当调用此方法时,会执行此命令的方法。

外观模式,英文名:Facade。

基本概念:外观模式为更大的代码体提供了一个方便的高层次接口,能够隐藏其底层的真实复杂性。

在jQuery等javascript库中经常可以看到。每当我们使用$.(el).css()等方法时,实际上我们是在使用外观模式。

举个例子:

跨浏览器的事件绑定。

var addEvent = function(el, ev, fn){
	if(el.addEventListener){
		el.addEventListener(ev, fn , false);
	}else if(el.attachEvent){
		el.attachEvent("on" + ev, fn);
	}else{
		el["on"+ev] = fn;
	}
};

这里的addEvent方法就是一个外观模式,我们只需要调用addEvent来进行事件的绑定,而它内部需要兼容其他浏览器进行的代码处理,我们不用去考虑。

它只暴露了addEvent方法,从而将更复杂的实现隐藏起来。

外观模式经常和模块模式一起实现,外观模式提供一个简单的api接口给开发人员调用,模块模式把具体的比较复杂的实现代码放到自己的内部的方法中。

加油!

原文地址:https://www.cnblogs.com/chaojidan/p/4484418.html