JS设计模式——10.门面模式
门面模式
这是一种组织性的模式,它可以用来修改类和对象的接口,使其更便于使用。它可以让程序员过得更轻松,使他们的代码变得更容易管理。
门面模式有两个作用:
- 简化类的接口
- 消除与使用她的客户代码之间的耦合
一个简单的门面模式
var addEvent = function(el, ty, fn){
var cases = [
function(el, ty, fn) { el.addEventListener(ty, fn, false); },
function(el, ty, fn) { el.attachEvent('on'+ty, fn); },
function(el, ty, fn) { el['on'+ty] = fn; }
];
if(el.addEventListener){
$.addEvent = cases[0];
}else if(el.attachEvent){
$.addEvent = cases[1];
}else{
$.addEvent = cases[2];
}
$.addEvent(el, ty, fn);
},
addEvent函数就是一个基本的门面,有了它,就可以把检查代码封装在一个地方,这可以让代码变得更简洁。这是一个应用门面模式对付一组设计得比较糟糕的API的案例,其具体做法就是用一个精心设计的API来包装她们。
用作便利函数的门面模式
function a(x){
return x;
}
function b(x){
return y;
}
function ab(x, y){
a(x);
b(y);
}
门面模式的另一个好处表现在对函数的组合上。这些组合而得的函数又叫便利函数。
其实我们完全可以将a,b两个函数在一开始的时候就放入到ab函数中,那么门面模式在这里有什么好处呢?
答案是分别提供a、b和ab这几个函数可以获得更多力度控制和灵活性。组合a和b可能会对应用程序造成破坏或者意想不到的结果。
下面就是一个常见的门面模式:
var JChen = window.JChen || {};
JChen.util = {
stopPropragation: function(e){
if(e.stopPropragation){
e.stopPropragation();
}else{
e.cancelBubble = true;
}
},
preventEvent: function(e){
if(e.preventEvent){
e.preventEvent();
}else{
e.returnValue = false;
}
},
stopEvent: function(e){ //这个就是便利函数
JChen.util.stopPropragation(e);
JChen.util.preventEvent(e);
}
};
设置HTML样式
基本做法
设置HTML的样式,只要对样式对象的特定属性赋值即可,例如:
var el = document.getElementById('content');
el.style.color = 'red';
门面模式
现在假设我们要一次设置几个元素的某个样式。如果分别设置显然是有些笨拙的,这个时候我们就可以使用门面模式了。
function setStyle(el, prop, val){
for(var i= 0, len=el.length; i<len; i++){
document.getElementById(el[i]).style[prop] = val;
}
}
setStyle(['foo', 'bar'], 'color', 'red');
稍加改进
要是我们还可以一次设置多个元素的多个样式就更好了,那样的话就不必反复使用setStyle方法了。
function setCSS(el, styles){
for( var prop in styles){
if(!styles.hasOwnProperty(prop)){ //必须不能是原型上的属性才是应该被设置的样式
continue;
}
styles(el, prop, styles[prop]);
}
}
setCSS(['foo', 'bar'], {
color: 'white',
background: 'black',
fontSize: '16px'
});
现在我们又用了一个门面模式去包含了刚才的门面模式,这下就正点多了。
门面模式的使用场合
判断是否应该应用门面模式的关键在于辨认那些反复成组出现的代码。如果函数b经常出现在函数a之后,那么门面模式就派上用场了。
另一个可能的目的是应对Javascript内置函数在不同浏览器中的表现的情况。addEvent就是其中一例。
门面模式之利
编写一次组合代码,然后就可以反复使用他,这有助于节省时间和精力。
通过门面模式,可以避免与下层子系统紧密耦合。这样可以对这个系统进行修改而不影响到客户代码。(也就是多粒度的控制)
门面模式之弊
有时候门面元素也会带来一些不必要的额外负担。方便的东西不一定就得用。门面模式常常会被滥用。在使用你心仪的门面函数之前请三思。
JS设计模式——10.门面模式的更多相关文章
- JS设计模式——5.单体模式
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
- python 设计模式之门面模式
facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库. 门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...
- js设计模式——7.备忘录模式
js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- js设计模式——5.状态模式
js设计模式——5.状态模式 代码演示 /*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯) class State { constructor(color) { this.color = ...
- js设计模式——4.迭代器模式
js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...
- js设计模式——2.外观模式
js设计模式——2.外观模式
- js设计模式——1.代理模式
js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
随机推荐
- ajax异步请求loading
1.找到一张loading图片 2.添加样式 <style> .loadingWrap{ position:fixed; top:; left:; width:100%; height:1 ...
- 利用Eric+Qt Designer编写倒计时时钟
[前言]前几日通过编写命令行通讯录,掌握了Python的基本语法结构,于是开始向更高水平冲击,利用Eric与Qt Designer 编写一个带界面的小程序.本次实操中也确实遇到了不少问题,通过学习也都 ...
- Laravel4快速安装方法,解决Laravel4安装速度慢
Laravel4原始安装方法 Laravel4 是构建在 Composer 之上的, 之前的安装方法是如下: composer create-project laravel/laravel you ...
- [AT697]フィボナッチ
题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^3)$,求$f_n$.$f$数组满足$f_1=f_2=\cdots=f_k=1$,$f_n=\sum\limits_{i ...
- SpringBoot之mongoTemplate的使用
springboot的版本1.5.17.RELEASE. 1.mongo的IP和端口 在resources下的application.properties中加入如下内容 spring.data.mon ...
- Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- NOI前总结
最近也就是天天考试,总结一下. 7.1 开场T1T2都是不可做的概率期望,只有T3看起来可做,于是怒干4h+,将题解里面的所有结论都推出来了,大模拟写的一点毛病都没有,可还是因为2-SAT掌握不熟结果 ...
- BZOJ 3230 相似子串 | 后缀数组 二分 ST表
BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...
- vim 折叠的用法
http://www.cnblogs.com/fakis/archive/2011/04/14/2016213.html 1. 折叠方式 可用选项来设定折叠方式: 可在Vim 配置文件中设置 set ...
- 【纪中集训2019.3.23】IOer
题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...