## 介绍
外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用。
## 正文
外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦。外观模式经常被认为开发者必备,它可以将一些复杂操作封装起来,并创建一个简单的接口用于调用。
外观模式经常被用于JavaScript类库里,通过它封装一些接口用于兼容多浏览器,外观模式可以让我们间接调用子系统,从而避免因直接访问子系统而产生不必要的错误。
外观模式的优势是易于使用,而且本身也比较轻量级。但也有缺点 外观模式被开发者连续使用时会产生一定的性能问题,因为在每次调用时都要检测功能的可用性。
下面是一段未优化过的代码,我们使用了外观模式通过检测浏览器特性的方式来创建一个跨浏览器的使用方法。
~~~
var addMyEvent = 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;
}
};
~~~
再来一个简单的例子,说白了就是用一个接口封装其它的接口:
~~~
var mobileEvent = {
// ...
stop: function (e) {
e.preventDefault();
e.stopPropagation();
}
// ...
};
~~~
## 总结
那么何时使用外观模式呢?一般来说分三个阶段:
**首先**,在设计初期,应该要有意识地将不同的两个层分离,比如经典的三层结构,在数据访问层和业务逻辑层、业务逻辑层和表示层之间建立外观Facade。
**其次**,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。
**第三**,在维护一个遗留的大型系统时,可能这个系统已经很难维护了,这时候使用外观Facade也是非常合适的,为系系统开发一个外观Facade类,为设计粗糙和高度复杂的遗留代码提供比较清晰的接口,让新系统和Facade对象交互,Facade与遗留代码交互所有的复杂工作。
参考:大话设计模式
- (1)编写高质量JavaScript代码的基本要点
- (2)揭秘命名函数表达式
- (3)全面解析Module模式
- (4)立即调用的函数表达式
- (5)强大的原型和原型链
- (6)S.O.L.I.D五大原则之单一职责SRP
- (7)S.O.L.I.D五大原则之开闭原则OCP
- (8)S.O.L.I.D五大原则之里氏替换原则LSP
- (9)根本没有“JSON对象”这回事!
- (10)JavaScript核心(晋级高手必读篇)
- (11)执行上下文(Execution Contexts)
- (12)变量对象(Variable Object)
- (13)This? Yes, this!
- (14)作用域链(Scope Chain)
- (15)函数(Functions)
- (16)闭包(Closures)
- (17)面向对象编程之一般理论
- (18)面向对象编程之ECMAScript实现
- (19)求值策略
- (20)《你真懂JavaScript吗?》答案详解
- (21)S.O.L.I.D五大原则之接口隔离原则ISP
- (22)S.O.L.I.D五大原则之依赖倒置原则DIP
- (23)JavaScript与DOM(上)——也适用于新手
- (24)JavaScript与DOM(下)
- (25)设计模式之单例模式
- (26)设计模式之构造函数模式
- (27)设计模式之建造者模式
- (28)设计模式之工厂模式
- (29)设计模式之装饰者模式
- (30)设计模式之外观模式
- (31)设计模式之代理模式
- (32)设计模式之观察者模式
- (33)设计模式之策略模式
- (34)设计模式之命令模式
- (35)设计模式之迭代器模式
- (36)设计模式之中介者模式
- (37)设计模式之享元模式
- (38)设计模式之职责链模式
- (39)设计模式之适配器模式
- (40)设计模式之组合模式
- (41)设计模式之模板方法
- (42)设计模式之原型模式
- (43)设计模式之状态模式
- (44)设计模式之桥接模式
- (45)代码复用模式(避免篇)
- (46)代码复用模式(推荐篇)
- (47)对象创建模式(上篇)
- (48)对象创建模式(下篇)
- (49)Function模式(上篇)
- (50)Function模式(下篇)
- (结局篇)