一日一摸之第五日:Façade(外观)模式

原创 2007年09月14日 12:42:00

为子系统中的一套接口提供了一个统一的接口。Facade 定义了一个更高层次的接口,使子系统更容易使用。

在开发一个系统时,在收集到用户对软件的要求之后,架构设计就开始了,架构设计的一个主要目的就是把系统划分成很多“板块”,划分的方式通常有两种:横向划分和纵向划分。

横向划分将系统按照商业目的的划分,也可以说是功能模块的划分,如一个软件公司可以划分成管理部、设计部、实施部、财务部等。纵向划分则不同,它按照抽象层次的高低,将系统划分成“层”Layer,如一个门户网站可能涉及到以下几个层:1、显示层,负责数据的显示、接受用户输入,像常见的HTML页面;2、领域层,这层封装了必要的商业逻辑,负责根据商业逻辑决定显示什么数据,以及根据用户输入的数据进行相应的计算,像有JavaBeanWebService等;3、数据库,存储数据,查询等;4、操作系统层;5、硬件层。

这里采用Layer的加法,而不用Tier,因为Tier更多地带有物理上的含义,不同的Tier往往位于不同的计算机上,通过网络连接,而Layer纯粹是逻辑上的概念,与屋里划分无关。

采用Layer架构的好处在于:1、任何一层的变化都可以很好地局限在该层,不会扩散到其他各层;2、更容易容纳新的技术和变化,各个层可以根据需要采用不同的技术。

在设计系统的时候,通常会将一个系统划分成几个较小的子系统,分而治之。还继续上面的例子,如果一个客户序号开发一个软件,显然上面提到的几个部门该客户都要一一找过,还要理好顺序,找完管理部之后再去找财务部,找好设计部设计好之后才能去找实施部,当然不会出现这样的事情,通过客户只需要和公司的销售联系,其他的事情都可以通过销售来传达实现,这里销售就起到了公司门面的作用,至于说你不通过销售而直接和公司部门联系也是没有问题的,但这样如果公司人员变动你就得再和另外的人联系。就像电脑一样,你通过它提供的外置接口,像键盘、鼠标这些东西和它交易,而不会要你直接操作内部设计,想RAMHD。不然会使得系统的逻辑变得不必要的复杂,维护成本变高,服用率降低。通过情况下应该都这样来实现,只提供一个操作接口,而不允许直接和内部通信,这样内部进行了调整,涉及面也最小,同时也降低了对客户端的要求,客户端就不用了解内部方法。同时也可以做到细节的隐藏。

Façade模式就是实现了这样一个功能的模式。外部要与一个子系统进行通讯必须通过一个统一的门面Façade对象来进行。

示例(DataBaseOperationFacade.java,下面这几个类可以放在一个java文件中,也可以放置到不同的java文件中,class权限除了façade之外设置为package权限)

封装数据库操作,将操作数据库的方法封装到一个package中,包中所有class都是包权限的,只有Façade是对包外开发的,这样对数据库的操作只能通过这个Façade提供的方法进行,同时Façade中各个Method还可以进行逻辑的实现,如执行一个SQL语句,必须首先获得数据库连接,然后才能执行。

 

/**

 *Facade Design Pattern Sample

 *@version 1.0,09/14/2007

 *All right reversed By tsimgsong

 */

package facade;

 import java.io.*;

 import java.util.*;

 import java.sql.*;

 

/**

 *数据库资源管理,数据库连接管理

 */

class DatabaseSource

{

       /**

        *取数据库连接,可建立一个或者通过JNDI获取

        */

       public static Connection getConnection(){

              System.out.println("Get a Connection");

              Connection conn = null ;

              return conn;

       }

 

       /**

        *释放数据库链接

        */

       public static void releaseConnection(Connection conn){

              System.out.println("Release Connection");

              try{

                     if(conn!=null)

                            conn.close();

              }catch(Exception e){

              }

       }

};

 

class DataBaseOperation

{

       public static void executeUpdate(Connection conn,String sql){

              System.out.println("Execute SQL:"+sql);

       }

       public static void executeSP(Connection conn,String spName){

              System.out.println("Execute Procedure:"+spName);

       }

 

};

 

/**

 *数据库操作Facade

 */

public class DataBaseOperationFacade

{

       /**

        *执行SQL语句

        *@param sql 待执行的SQL语句

        */

       public static void executeUpdate(String sql){

              System.out.println("Execute SQL"+sql);

              Connection conn = DatabaseSource.getConnection();

              DataBaseOperation.executeUpdate(conn,sql);

              DatabaseSource.releaseConnection(conn);

       }

      

       /**

        *执行存储过程

        *@param spName 存储过程名称

        */

       public static void invokeSP(String spName){

              System.out.println("Execute Procedure:"+spName);

              Connection conn = DatabaseSource.getConnection();

              DataBaseOperation.executeSP(conn,spName);

              DatabaseSource.releaseConnection(conn);

       }

 

};

同样Façade可以实现多层,如在一个子系统中,可以划分成多层,就想操作系统一样,内核封装在最里面,通过一个Façade向外提供功能接口。

以前在开发EJB时,Session Façade应用非常广泛。通过session FaçadeEntity Bean加一层壳,客户机不可直接访问Entity Bean,而只是和Session Façade交互,将Session Bean作为Façade来使用。

Ref

1http://fanqiang.chinaunix.net/program/project/2005-06-16/3316.shtml

 

设计模式(结构型)之外观模式(Facade Pattern)

一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使用时代码较为复杂。外观模式通过引入一个新的外观类(Facade)来实现该功能,外观类为多个业务类的调用提供统...
  • yanbober
  • yanbober
  • 2015年05月04日 09:29
  • 2424

Façade(外观模式)

Façade模式的主要思想为子系统中的一组接口提供一个一致的界面,这个接口使得这一子系统更加容易使用。 应用场景 引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可...
  • fcunren
  • fcunren
  • 2014年08月30日 15:21
  • 492

webkit中的设计模式 -- Façade 外观模式

转自:http://vvvvbbbb.iteye.com/blog/963753 要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为...
  • haima1998
  • haima1998
  • 2013年05月23日 10:11
  • 923

门脸模式Façade

门面模式Façade    今天看servlet一篇博客时,老是提到Façade这玩意儿,本来想以后有时间看看设计模式的,结果经常出现就不好了,严重影响了对servlet的学习。所以就提前先了解...
  • smallson4049
  • smallson4049
  • 2014年05月22日 17:13
  • 413

Façade模式--门面模式

举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去n个地方办理n个手续(现在大学合并后就更加麻烦,因为可能那n个地方都隔的比较远)。但是实际上我们需要的就是一个最后一道手续的证...
  • SunboyJohn690905084
  • SunboyJohn690905084
  • 2016年07月07日 15:37
  • 287

Net设计模式实例之外观模式(Façade Pattern)

一、外观模式简介(Brief Introduction) 外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。   二、解决的问题(W...
  • my98800
  • my98800
  • 2017年01月14日 12:55
  • 173

结构型模5:外观模式(Façade Pattern)

概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之...
  • u014514671
  • u014514671
  • 2014年05月22日 19:54
  • 223

设计模式9—Façade设计模式

Facade门面设计模式为子系统中的一组接口提供一个一致的界面,应用程序本身将不再...
  • duanxin8678
  • duanxin8678
  • 2014年08月12日 08:31
  • 210

Facade模式详解--设计模式(11)

Facade模式 一 意图   为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二 动机   将一个系统划分成为若干个子系统有...
  • fanyun_01
  • fanyun_01
  • 2016年06月29日 08:57
  • 1215

装饰者模式与外观者模式的区别

(转载)http://bbs.bccn.net/thread-216717-1-1.html 很久没有来这一个论坛里了,一上来就看到很多关于设计模式的贴子上了精,今天我也来谈一下设计模式,我现在所介绍...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016年03月03日 09:55
  • 1093
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一日一摸之第五日:Façade(外观)模式
举报原因:
原因补充:

(最多只允许输入30个字)