JS门面模式
门面模式
前言
门面模式的本质是实现一个简单的同一接口来处理对各个子系统接口的处理和调用.和桥接模式不同的是:桥接模式中的各个类是全然独立的,桥接模式仅仅在必要的时候将这些类关联起来.
门面模式则有点不同.门面模式事实上能够非常形象的比作是一家咖啡店的店面窗体,客户仅仅须要说明自己是须要哪种咖啡,也就是说咖啡店提供给客户的仅仅是各类咖啡的选择接口,而将内部的各个子类行为封装起来,比方加水啊,拆包装啊啥的,咱也不懂,就瞎说呗,反正就是把制作咖啡的过程封装起来,不用你知道,仅仅把最后你想要的咖啡给你.
正文
门面模式的长处在于我们将客户与较为复杂的子系统方法和接口分离开来,减少用户与各个子系统间耦合度来提高代码指令.
看下图:
以下是一个纯粹形式化案例:
function a(x){
// do something
}
function b(y){
// do something
}
function ab( x, y ){
a(x);
b(y);
}当然形式上与桥接模式有非常大程度上类似,以下的小样例能够感受下其和桥接模式不同
var N = window.N || {};
N.tools = {
stopPropagation : function( e ){
if( e.stopPropagation ){
e.stopPropagation();
}else{
e.cancelBubble = true;
}
}, preventDefault : function( e ){
if( e.preventDefault ){
e.preventDefault();
}else{
e.returnValue = false;
}
}, stopEvent : function( e ){
N.tools.stopPropagation( e );
N.tools.preventDefault( e );
}
}一个小的阻止事件冒泡一级组织默认事件工具方法,从其代表性的stopEvent不难看出事实上质与桥接模式的差别.其上面两个方法stopPropagetion和preventDefault非常会令人认为类似于适配器模式,的确是非常类似于适配器模式,只是适配器模式的主要针对于将接口进行适配包装,时期适用于各种不同兼容性的环境.意思差点儿相同就是说,假设提供兼容性的信息使其方法在不同环境下生成不同的方法,比方一些匿名自调用函数依据推断返回不同函数的类似形式,而不是说每次执行再在函数内部进行推断执行,则称其为适配器模式更为适合一点.
对于门面模式的一大优点就是对函数的组合上,宛如上面纯粹模式的样例,门面模式形式的组合函数又称为便利函数,看案例:我们须要将id为content的div元素设置为文本颜色red,那么简单的代码:
var element = document.getElementById('content');
content.style.color = 'red';
//如还想设置字体大小为20px
content.style.fontSize = '20px';那么当一个元素须要设置多种属性时:
function setStyle(id,styles){
var element=document.getElementById(id);
for(var key in styles){
if(styles.hasOwnProperty(key)){
element.style[key]=styles[key];
}
}
}
setStyles('content',{
color:'red',
fontSize:'20px'}
);setStyles就相当于一个便利函数,也能够视作门面元素,只是是相对于最简单的一类.
假设说是具有好几个元素,均须要设置同样的一批属性,那么将setStyles包装一下,将其嵌入在还有一个门面元素之中,组合成为一个结构相对复杂的门面模式实例:
function setCSS( ids, styles ){
for( var i = 0,len = ids.length; i<len; i++ ){
setStyles( ids[i], styles );
}
}从setCSS中能够看出,对于使用setCSS的用户来收,根本不知道其内部的setStyles代码形式.可想而知,当一块逻辑代码较为复杂,调用很多各个接口等的时候,我们使用门面模式将其封装,能够带来非常大的便利性.
总结
门面模式大致上能够分为两个小类,某块代码重复出现,比方函数a的调用基本都出如今函数b的调用之前(尽管基本上没有那么简单的形式),那么你能够考虑将这块代码使用门面演示样例包装起来,来优化结构.另一种即是对于一些浏览器不兼容的API,放置在门面模式内部进行推断,处理这些问题最好的方式便是将跨浏览器差异所有集中放置到一个门面模式实例中来提供一个对外接口.
当然也须要注意的是,对于门面模式的滥用所产生的后果也是非常严重的,不但使代码总体结构较为松散,还使代码可读性严重减少,寻找一处BUG可能须要从一个门面实例中找到还有一个,再联系到第三个第四个,会使代码的维护性较差.
JS门面模式的更多相关文章
- 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)
一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...
- JS设计模式——10.门面模式
门面模式 这是一种组织性的模式,它可以用来修改类和对象的接口,使其更便于使用.它可以让程序员过得更轻松,使他们的代码变得更容易管理. 门面模式有两个作用: 简化类的接口 消除与使用她的客户代码之间的耦 ...
- js设计模式-门面模式
适用场景:门面模式在DOM脚本编程这种需要对各种不一致的浏览器接口的环境中很常用. 例子:阻止模式事件 var DED = widow.DED || {}; DED.util = { stopProp ...
- 【读书笔记】读《JavaScript设计模式》之门面模式
一.前言 门面模式,也称Facade(外观)模式.核心的两点作用—— 1> 简化类的接口(让接口变得更加容易理解.容易应用.更加符合对应业务),来掩盖一个非常不同或者复杂的实现 2> 消除 ...
- js--27门面模式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- javaEE设计模式——门面模式
1.本节内容 门面模式的意图介绍 门面模式带来的好处 门面模式的应用场景 实现模式的3中方式:POJO.无状态与有状态回话Bean门面 有状态与无状态回话Bean门面的重要差别 关于门面模式使用的警告 ...
- 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结
门面模式的一个典型应用:Socket 套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: 连接使用的 ...
- FacadePattern(门面模式)
/** * 外观模式(门面模式) * @author TMAC-J * 外观模式是通过访问一个前台来实现对子系统的访问,其和代理模式的区别是 * 代理模式是通过代理一个类的形式,也就是说一对一的关系 ...
- Tomcat源代码-门面模式(Facade)
从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...
随机推荐
- 如何通过IP地址分辨公网、私网、内网、外网
如何通过IP地址分辨公网.私网.内网.外网 内.外网是相对于防火墙而言的,在防火墙内部叫做内网,反之就是外网. 在一定程度上外网等同于公网,内网等同于私网. 地址为如下3个区域就是处于私网 ...
- nodeJS学习(3)--- npm 配置和安装 express4.X 遇到的问题及解决
前言:懒得看前面两篇介绍的也可以从本节直接参考,但建议最好了解下,因为 4.X 的express 已经把命令行工具分离出来 (链接https://github.com/expressjs/genera ...
- compiler related
1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme).源程序中常见的记号可以归为几大类:关键字.标识符.字面量和特殊符号.词法分析器的输入 ...
- duilib入门简明教程 -- 自绘标题栏(5) (转)
原文转自 http://www.cnblogs.com/Alberl/p/3343667.html 如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了 ...
- 【剑指offer】二维数组中的查找☆
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 自己的思路实在 ...
- jemalloc原理分析
netty4引入了内存池的概念,它的主要思想源自于jemalloc,由于难以理解netty中这一块的代码,我决定先看一看网上的相关文章 官方git jemalloc原理分析 jemalloc和内存管理 ...
- 牛客网 牛客小白月赛1 H.写真がとどいています
H.写真がとどいています 链接:https://www.nowcoder.com/acm/contest/85/H来源:牛客网 这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就 ...
- Codeforces Gym100814 I.Salem-异或 (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
这个题就是二进制,找两个数相应的二进制相对应的位置上数不同的最多的个数.异或写就可以. 一开始还想麻烦了,找出来最大的偶数和最大的奇数,最小的偶数和最小的奇数,但是这样想考虑的不全.因为范围比较小,直 ...
- Network | 协议栈
因特网协议栈Internet protocol stack: 应用层Application layer.运输层Transport layer.网络层Network layer.链路层Data link ...
- scanf格式控制符之%[]的应用
考虑只读入小写字母的字符串,这个问题要如何用scanf解决呢? 这就用到了%[] 这个格式控制符,它支持a-z这样的格式控制 char s[111]; scanf("%[a-z]" ...