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可能需要从一个门面实例中找到另一个,再联系到第三个第四个,会使代码的维护性较差.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 11:56:54

JS门面模式的相关文章

JS设计模式(门面模式)

<!--JS设计模式(门面模式)--> // 门面模式的概念:简化API接口 最经典的就是事件 // 做一件事情: 必须要调用2个函数分别是 a , b //案例:获得页面上多个元素并设置css样式 window.onload=function(){ setCss(["div1","div2","div3"],{ background:"blue", color:"#fff" }); } fun

大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)

一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, 1 function Employee(name) { 2 var name = name; 3 this.say = function () { 4 console.log("I am employee " + name) ; 5 } ; 6 } 代码中“say”是一个function,Employee也是一个functio

【JS 设计模式 】门面模式之DOM元素绑定事件

门面模式的作用:一是简化类的接口,通过用一个接口(函数或方法)来封装复杂的逻辑代码从而客户端可以使用一个接口来调用它:二是消除类与使用它的客户代码之间的耦合,使客户代码和复杂的逻辑代码分离,也就是耦合: ?在何种情况下会使用:1)为一个复杂子系统提供一个简单接口.2)提高子系统的独立性.3)在层次化结构中,使用Facade模式定义系统中每一层的入口,使它们各尽其责. 用绑定事件来举例门面模式,IE浏览器和其它(火狐.谷歌)浏览器在对html元素绑定事件上是有区别的. ie绑定代码: var bu

js--27门面模式

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Unt

门面模式

门面模式[Facade Pattern ] interface LetterProcess{ void writeContent(String content); void fillEnvelope(String address); void LetintoEnvelope(); void sendLetter(); } class LetterProcessImpl implements LetterProcess{ @Override public void writeContent(Str

第 7 章 门面模式【Facade Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,我们继续讲课.大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的呀,信多了还是麻烦,比如到了情人节,为了大海捞针,给十个女孩子发情书,都要这样跑一遍,你不要累死,更别说你要发个广告信啥的,一下子发1 千万封邮件,那不就完蛋了?那怎么办呢?还好,现在邮局开发

JavaScript高级---门面模式设计

门面模式 两个作用: 1.简化类的接口 2.消除类与使用它的客户代码之间的耦合 门面模式常常是开发人员最亲密的朋友.它几乎是所有javascript库的核心原则 门面模式的目的是为了让开发人员用更简单的方法调用一些相对复杂或组合的方法,主要就是简化开发的复杂性,提供一个相对容易的API去调用内部的方法供外界去使用,这样程序员开发会变得轻松些,编写一次组合代码后可以反复的去使用它,有助于节省时间和精力 注意: 不要滥用门面模式,所以使用你心仪的门面之前一定要三思而定,搞不好你就会小题大做 引入概念

设计模式(七)门面模式(Facade)-结构型

门面模式Facade 门面模式:统之间的接口.框架之间的衔接 (1)使用接口的形式来开发,不需要知道接口中内部方法的实现: (2)门面模式就是为子系统对外提供的一组接口提供一个统一的界面,使得其他系统对该系统的访问都通过这个统一的界面来完成. (3)当一个负载的系统需要对外提供接口时,就需要将对提供的接口统一封装在外观类里,供外系统使用. 门面模式原理图 门面模式原理图 不用门面设计模式的情况 Holiday.java public class Holiday { public double g

IOS设计模式之二(门面模式,装饰器模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 门面(Facade)模式(译者注:facade有些书籍译为门面,有些书籍译为外观,此处译为门面) 门面模式针对复杂的子系统提供了单一的接口,不需要暴漏一些列的类和API给用户,你仅仅暴漏一个简单统一的API. 下面的图解释了这个概念: 这个API的使用者