关闭

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

511人阅读 评论(0) 收藏 举报

为子系统中的一套接口提供了一个统一的接口。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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:68509次
    • 积分:1008
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:8篇
    • 译文:1篇
    • 评论:2条
    文章分类
    最新评论