`
zhouyrt
  • 浏览: 1174029 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

外观/门面模式(Facade)

阅读更多

Facade Pattern 国内有些书译为门面模式,如「Java与模式」,「JavaScript设计模式」。有些则译为外观模式,如「设计模式:可复用面向对象软件的基础」,「Java设计模式」。这里使用名词“外观模式”。

 

外观模式属于接口型模式,它提供一个更方便,高层接口,使用一致性的界面使得API更加容易使用。它有两个作用:

  1. 简化复杂接口
  2. 解耦和,屏蔽客户端对子系统的直接访问

 

外观模式在JavaScript中被众多类库频繁使用。由于早期各浏览器提供的API差异性较大,类库的基本作用之一是扫平这些凹凸不平,提供统一接口供前端工程师使用。使用外观模式,我们可以间接地与一个复杂子系统打交道,与直接访问相比耦合性更低,更不易出错。

 

比如添加事件标准浏览器使用addEventListener,旧版本IE使用attachEvent,可能自己需要封装一个addEvent函数,这个addEvent函数就是一个门面。

 

function addEvent(el, type, fn) {
    if (el.addEventListener) {
        el.addEventListener(type, fn, false)
    } else if (el.attachEvent) {
        el.attachEvent('on' + type, fn)
    } else {
        el['on' + type] = fn
    }
}

 

实际就是将两个不同的函数放到自己定义的函数里,之后使用该函数完成特定功能而不再使用有差异性的函数。

 

又如处理DOM事件时,有时会同时使用以下方法

e.stopPropagation()
e.preventDefault()

 可以使用外观模式创建一个新方法stop同时调用这两个方法

function stop(e) {
    e.stopPropagation()
    e.preventDefault()   
}

 

jQuery中大量使用外观模式,比如数据缓存模块,内部internalData,internalRemoveData是低级API,实现核心功能,外部提供了data,removeData这两个高级API供客户端程序员使用。

事件模块也是如此,内部有jQuery.event.add,jQuery.event.remove,jQuery.event.trigger等低级API,向外提供了on/bind,off/unbind,trigger等高级API,甚至再利用on又提供了.click/.dblclick/mouseover/mousedown等更快捷的添加事件API。

Ajax模块也是外观模式的典型例子,jQuery提供了一个基本的,低级接口$.ajax方法,通过封装$.ajax产生了一些便利函数$.get, $.post。再通过封装$.get又产生了$.getJSON,$.getScript等更高级的方法。

 

jQuery里的事件模块和Ajax模块可以说是外观模式在JS中的经典应用。

 

适用场合

对于那些反复同时出现的代码,如函数a和b多次同时出现在代码中,应考虑将a,b组合起来放到一个新函数中。

 

之利

简化了一些复杂接口(如$.ajax, $.event.add),清除不再需要的大对象以及提供一种更加单一,便利的方式展现接口功能。编写一次组合代码,就可以反复使用它,节省了代码量,时间和精力。它还提供了较高层的功能,抽象,降低客户端代码对底层接口的耦合。如$.getJSON,通过$.ajax方法也可以得到相同的效果。但每次都需要配置相同的参数,如果获取JSON的需求很频繁,页面中的相同的代码就需要写很多次。而封装一次$.getJSON,之后就少写很多代码,且该方法更直观。

 

之弊

外观模式并非必不可少,同样的功能不使用它也能完成功能。如不使用$.getJSON,通过$.ajax方法也可以得到相同的效果。此外由于增加了一层闭包,性能会有一定降低。

 

分享到:
评论

相关推荐

    外观模式facade

    外观模式(Facade)是设计模式中的一种结构型模式,它为复杂的系统或子系统提供了一个统一的入口点,简化了客户端与系统之间的交互。通过外观模式,我们可以将系统的内部复杂性隐藏起来,使得用户只需要与一个简单的...

    迪米特法则---门面Facade模式.docx

    门面(Facade)模式是一种设计模式,遵循迪米特法则,旨在简化子系统的使用,减少客户端与子系统之间的复杂依赖关系。迪米特法则主张一个对象应该尽量减少与其他对象的交互,只与直接的朋友交流,以此提高系统的内聚...

    Facade模式

    **外观(Facade)模式**是软件工程中一种常用的设计模式,属于结构型模式。它提供了一个统一的接口,用于访问子系统中的一组接口。Facade模式使得子系统更易于使用,降低了客户端与复杂子系统之间的耦合度。在Java...

    facade门面模式

    门面模式(Facade Pattern)是一种结构型设计模式,它的主要目的是为复杂的子系统提供一个统一且简单的接口,使得客户端能够更方便地与这些子系统交互,而无需了解子系统的内部实现细节。这种模式降低了客户端与子...

    设计模式之外观模式

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,它的主要目的是为了解耦系统,提供一个统一的入口,使得客户端可以更容易地使用复杂的子系统。在Java中,外观模式通常用于简化对复杂系统的访问,它创建了...

    解析C#设计模式编程中外观模式Facade Pattern的应用

    外观模式包含两个主要角色:门面(Facade)和子系统(Subsystems)。门面是客户端与子系统交互的唯一入口,它封装了子系统的所有接口,提供了一个简化的接口给客户端。子系统则是被门面所协调的复杂组件集合,它们...

    设计模式之门面模式(附demo)

    门面模式(Facade Pattern)是软件工程中一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。这个统一的接口使得客户端不必了解子系统内部的复杂性,只需要与门面进行交互即可。门面模式简化...

    第14章_外观模式.ppt

    外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为...

    设计模式—外观模式

    **外观模式(Facade Pattern)**是软件工程中一种常用的设计模式,属于结构型模式,它为复杂的系统或者子系统提供一个简洁的接口,使得客户端无需了解系统内部的复杂性,只需要通过这个统一的接口进行交互。外观模式...

    c#代码介绍23种设计模式-11外观模式(附代码)

    门面(Facade)角色:客户端调用这个角色的方法。该角色知道相关的一个或多个子系统的功能和责任,该角色会将从客户端发来的请求委派带相应的子系统中去。 子系统(subsystem)角色:可以同时包含一个或

    Java 23种设计模式14外观模式.pdf

    外观模式(Facade Pattern),又称门面模式,属于对象结构型模式的一种。其主要作用是为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易被使用。在实际应用中,当一个系统变得越来越复杂,对外暴露的...

    15 外观模式:遥控无人机.pdf

    外观模式(Facade Pattern)是一种设计模式,它在JavaScript中同样适用。这种模式的主要目的是提供一个统一的接口,以便客户端能够更简单地与复杂的子系统进行交互。在上述内容中,通过遥控无人机的例子来阐述了外观...

    c++设计模式-结构型模式-外观模式

    外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低...

    Java设计模式详解之门面模式(外观模式)

    门面模式(Facade Pattern),又称为外观模式,是软件设计中的一种结构型模式。它的主要目的是为了解耦客户端与复杂系统之间的关系,通过提供一个简单的统一接口,使得客户端可以方便地使用系统,而无需关心系统内部...

    Python笔记之facade模式

    facade模式,即门面模式,也称外观模式,这个模式的核心思想是使用facade对象为外部客户端提供一个统一的访问一组子系统的接口,即客户端不会直接与各个子系统交互,而是通过facade对象与各个子系统进行通信并使用子...

    设计模式中的facade外观模式在JavaScript开发中的运用

    外观模式(门面模式),是一种相对简单而又无处不在的模式。外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用。 外观模式并不是适配器模式,适配器模式是一种包装器,用来对接口进行适配以便在不...

Global site tag (gtag.js) - Google Analytics