在写门面模式之前,我总结了一下,觉得门面模式的写法和单体模式有些相似。
但查阅过一些资料和朋友讨论之后,发现门面模式主要偏向于解决一些差异化的问题。
我们先看一个简单的例子。
//这是一个简单的门面模式例子,一个需求在不同的浏览器里有差异化。
var Facade = {};
Facade.isIE = function(){
if(document.all){
alert("这是IE");
//do something...
}else{
alert("这不是IE");
//do something...
}
}
假设现在要设计一个库,里面需要处理不同浏览的事件差异化问题。
比如,IE下event事件是在window对象下。
IE下,事件目标和标准浏览器的不同。
IE下,阻止事件静默行为。
......
好,我们看以下这个例子。
//这是一个简单的门面模式例子
var Obj = {};
var Obj.util = {};
var Obj.util.Event = {
//解决不同浏览器的事件差异
getEvent:function(e){
return e||window.event;
},
//解决事件目标对象差异
getTarget:function(e){
return e.target || e.srcElement;
}
//阻止浏览器静默方法差异解决
preventDefault:function(e){
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
}
其实门面模式的就是把差异问题放在一个函数中,这样就可以提供一个一致的接口。
或者我们还可以针对IE和标准浏览器的事件绑定的差异写一个例子。
var addEvent = function(el,type,fn){
if(window.addEventListener){
el.addEventListener(type,fn);
}else if{
el.attachEvent('on' + type,fn);
}else{
el['on'+type] = fn;
}
}
本模式也被称为外观模式。