门面模式

这是一种组织性的模式,它可以用来修改类和对象的接口,使其更便于使用。它可以让程序员过得更轻松,使他们的代码变得更容易管理。

门面模式有两个作用:

  1. 简化类的接口
  2. 消除与使用她的客户代码之间的耦合

一个简单的门面模式

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.门面模式的更多相关文章

  1. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  2. python 设计模式之门面模式

    facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库.   门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...

  3. js设计模式——7.备忘录模式

    js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...

  4. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  5. js设计模式——5.状态模式

    js设计模式——5.状态模式 代码演示 /*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯) class State { constructor(color) { this.color = ...

  6. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

  7. js设计模式——2.外观模式

    js设计模式——2.外观模式

  8. js设计模式——1.代理模式

    js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...

  9. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

随机推荐

  1. 移动端 H5 弹出层 fixed 内容可滚动

    <div class="alert_wapper"> <div class="wapper"> <!--内容 --> < ...

  2. 在tensorflow环境下安装matplotlib

    在运行程序时,报错ImportError: No module named 'matplotlib',如图.经网上查询发现是没有安装matplotlib 因此记录一下在tensorflow环境下安装m ...

  3. 【Java并发编程】之一:可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...

  4. Graph And Its Complement CodeForces - 990D(思维构造)

    题意: 图中有n个点,开始有a个连通块,然后连着的边断开,不连的边连上,变为b个连通块,输出原图的邻接矩阵. 解析: 原图中连通块大于1的图,经过上述操作后,一定变成只有1个连通块的图. 若n != ...

  5. 从商用到开源:15个维度,全面剖析DB2与MySQL数据库的差异

    随着MySQL数据库的应用越来越广泛,DB2向MySQL数据库的迁移需求也越来越多.进行数据库之间迁移的时候,首先遇到的并且也是最基本最重要的就是两种数据库数据类型之间的转换. 相关阅读: 从商用到开 ...

  6. 20135319zl elf文件报告

    一. 查看资料 使用vim /usr/include/elf.h可以查看elf文件头 二. 找到.text hexeditor po 地址为0x32,即第51字节储存的是elf header最后一个域 ...

  7. 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件

    myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件. 正常的web项目有目录 src/main/resources 和 src/main/java 这两个目录默认在编译发布时 ...

  8. bzoj1027【JSOI2007】合金

    题目描述 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...

  9. linux内核增加系统调用--Beginner's guide

    Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...

  10. CODEVS 2171 棋盘覆盖

    2171 棋盘覆盖 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖. 错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数 ...