一日一摸之第五日: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

 

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

相关文章推荐

外观模式(Façade Pattern)

一、外观模式简介(Brief Introduction) 外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。   二、解决的问题(W...

第11章 外观模式(Façade Pattern)

外观模式(Façade Pattern) ——.NET设计模式系列之十二 Terrylee,2006年3月 概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致...

(第Ⅲ部分 结构型模式篇) 第11章 外观模式(Façade Pattern)

概述在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖...

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

Façade门面设计模式为子系统中的一组接口提供一个一致的界面,应用程序本身将不再直接依赖于子系统原件,而是依赖一个门面,当想要修改某个原件的行为时,只需要修改实现类即可,应用程序本身不需要做任何修改...

Façade模式--门面模式

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

【日常】摸一摸怎样把LOL修改成英文版

RT

第14章_外观模式

  • 2012-09-27 10:29
  • 1.12MB
  • 下载

外观模式.txt

一日一设计模式之C++篇(Build模式)

公司的火影手游项目美术资源还没有到位,所有最近闲着没事在看C++的设计模式。虽然现在工作一直在用unity3d下写C#脚本,但是一直以来对C++的情有独钟让我坚持用C++的角度去看待软件开发。设计模式...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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