门面模式

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

门面模式有两个作用:

  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就是其中一例。

门面模式之利

编写一次组合代码,然后就可以反复使用他,这有助于节省时间和精力。

通过门面模式,可以避免与下层子系统紧密耦合。这样可以对这个系统进行修改而不影响到客户代码。(也就是多粒度的控制)

门面模式之弊

有时候门面元素也会带来一些不必要的额外负担。方便的东西不一定就得用。门面模式常常会被滥用。在使用你心仪的门面函数之前请三思。

转载于:https://www.cnblogs.com/JChen666/p/3651641.html

JS设计模式——10.门面模式相关推荐

  1. 设计模式之门面模式详解

    设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...

  2. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

    [网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...

  3. python设计模式名片_Python设计模式之门面模式简单示例

    本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...

  4. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  5. java设计模式之门面模式

    定义: 门面模式又叫做外观模式,提供了一个统一的接口,用来访问子系统中的一群接口.其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式 使用场景: 为一个复杂的模式或者子系统提供一个 ...

  6. [C++实现 设计模式(14)] : 门面模式

    文章目录 情景描述 门面模式的定义 门面模式的应用 门面模式的优点 门面模式的缺点 门面模式的是使用场景 门面模式的注意事项 一个子系统可以有多个门面 门面不参与子系统内的业务逻辑 *参考书籍* : ...

  7. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

  8. 浅谈PHP设计模式的门面模式

    简介: 门面模式又称之为外观模式,属于结构型的设计模式. 用于为子系统中的一组接口提供一致的调用方案.门面模式定义了一个高层接口,引入门面角色之后,只需要直接与门面角色交互,降低了系统的耦合度. 适用 ...

  9. 设计模式之门面模式和调停者模式

    文章目录 前言 一.门面模式Facade 1.定义 2.案例说明 3.代码实现 二.调停者模式Mediator 1.定义 2.案例说明 3.代码实现 总结 前言 本人对于设计模式的学习,仅供参考! 一 ...

最新文章

  1. springboot + redis + 注解 + 拦截器 实现接口幂等性校验
  2. 计算机网络总结:第三章 运输层
  3. 【深度学习】一文概览神经网络模型
  4. 01-mysql数据库入门篇-认识mysql-01-05
  5. python工程师工资状况_【python工程师工资|python工程师待遇怎么样】-看准网
  6. 信度和效度经典例子_浅析经典目标检测评价指标--mmAP(一)
  7. php 命令行 循环,Linux_批处理的循环效果脚本,第一次运行 执行命令工A 第 - phpStudy...
  8. mangos架设魔兽世界私服
  9. JDBC12 ORM01 Object[]存放一条记录
  10. python多进程与多线程_第十五章 Python多进程与多线程
  11. [毕业生的商业软件开发之路]解决方案资源管理器
  12. coreseek 利用python作数据源建立索引
  13. Z05 - 033、访客分析 - 独立访客
  14. 3-10 统计输入字符串中的单词个数及单词的平均长度(高教社,《Python编程基础及应用》习题7-7)
  15. 用 JavaScript 编写日历
  16. 再谈计算机编程的学习
  17. 如何ping网站的IP地址
  18. 【小5聊】回看2022,展望2023,分享我的年度总结和感想,在一个行业十年,坚持下去你就是这个行业的专家
  19. Windows的hosts文件所在位置
  20. Python+numpy画一幅纯颜色的灰度图,并将另一幅图片置于中间

热门文章

  1. 如何跨越线程调用窗体控件?(1)
  2. bluR blUr bLur...闷的时候就听Blur
  3. ASP.NET画图全攻略(上)
  4. 多线程是并行还是并发_并发,并行,线程,进程,异步和同步有相关性吗?
  5. 第十一篇:稳定性之面向失败设计【过载保护】
  6. MATLAB solve函数计算得到lambertw函数,用vpa转换即可
  7. 10虚拟机的删除和迁移
  8. oracle 二进制日志格式,二进制日志
  9. 预装Win8笔记本改重装Win7的方法
  10. 多进程IterableDataset流式读取数据的坑:每个进程会读取一遍完整数据