您的位置:首页 > 其它

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

2007-09-14 12:42 405 查看
为子系统中的一套接口提供了一个统一的接口。Facade 定义了一个更高层次的接口,使子系统更容易使用。
在开发一个系统时,在收集到用户对软件的要求之后,架构设计就开始了,架构设计的一个主要目的就是把系统划分成很多“板块”,划分的方式通常有两种:横向划分和纵向划分。
横向划分将系统按照商业目的的划分,也可以说是功能模块的划分,如一个软件公司可以划分成管理部、设计部、实施部、财务部等。纵向划分则不同,它按照抽象层次的高低,将系统划分成“层”Layer,如一个门户网站可能涉及到以下几个层:1、显示层,负责数据的显示、接受用户输入,像常见的HTML页面;2、领域层,这层封装了必要的商业逻辑,负责根据商业逻辑决定显示什么数据,以及根据用户输入的数据进行相应的计算,像有JavaBean、WebService等;3、数据库,存储数据,查询等;4、操作系统层;5、硬件层。
这里采用Layer的加法,而不用Tier,因为Tier更多地带有物理上的含义,不同的Tier往往位于不同的计算机上,通过网络连接,而Layer纯粹是逻辑上的概念,与屋里划分无关。
采用Layer架构的好处在于:1、任何一层的变化都可以很好地局限在该层,不会扩散到其他各层;2、更容易容纳新的技术和变化,各个层可以根据需要采用不同的技术。
在设计系统的时候,通常会将一个系统划分成几个较小的子系统,分而治之。还继续上面的例子,如果一个客户序号开发一个软件,显然上面提到的几个部门该客户都要一一找过,还要理好顺序,找完管理部之后再去找财务部,找好设计部设计好之后才能去找实施部,当然不会出现这样的事情,通过客户只需要和公司的销售联系,其他的事情都可以通过销售来传达实现,这里销售就起到了公司门面的作用,至于说你不通过销售而直接和公司部门联系也是没有问题的,但这样如果公司人员变动你就得再和另外的人联系。就像电脑一样,你通过它提供的外置接口,像键盘、鼠标这些东西和它交易,而不会要你直接操作内部设计,想RAM、HD。不然会使得系统的逻辑变得不必要的复杂,维护成本变高,服用率降低。通过情况下应该都这样来实现,只提供一个操作接口,而不允许直接和内部通信,这样内部进行了调整,涉及面也最小,同时也降低了对客户端的要求,客户端就不用了解内部方法。同时也可以做到细节的隐藏。
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çade给Entity Bean加一层壳,客户机不可直接访问Entity Bean,而只是和Session Façade交互,将Session Bean作为Façade来使用。
Ref:
1、http://fanqiang.chinaunix.net/program/project/2005-06-16/3316.shtml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: