读书人

设计方式初探(七)之facade(外观)

发布时间: 2012-08-26 16:48:06 作者: rapoo

设计模式初探(七)之facade(外观)

Facade模式的应用很普遍,简单的说就是将很多子系统例如(数据库的连接,处理sql的statement,返回结果resultset等等),他们的共同协作一起完成了某项事情比如从数据库中查询数据,更新或者其它。。。

?

有的时候我们为了将系统模块分为很多子模块分别进行设计是因为在后期方便我们的扩展和维护,并且可以达到一定的松耦合效果,但是当我们设计api的时候,应用端的人员会分别对几个子系统进行编码以达到他们的目的,这样对他们的要求就是需要声明每一个模块接口,并且实例化具体的类(jdbc在设计的时候还是很不错的,很难看到具体的类的实例化的工作,一般都是通过静态工厂方法获得的),在Gof的关于facade最后一点“相关模式”中,它说到facade和抽象工厂的协作以达到我们只需要对一个称做facade类进行逻辑编码并且可以隐示的获得需求的类,我马上就想到hibernate中的sessionfactory,貌似在sessionfactory的配置中只需要获得一个数据源,就可以产生一个sessionfactory并且从中通过getSession方法获得对数据库的会话对象,然后对数据库的操作都是通过这个session进行的。

?

比如一个普通的jdbc数据库连接可能这么写:

?

public class CommonJDBC{        Connection conn = null;        Statement stat = null;        ResultSet rs = null;        try{                Class.forName("DRIVER").newInstance();                conn = DriverManager.getConnection(url,usr,pwd);                String sql = "select from TABLE where COLUMN_NAME = ?";                stat = conn.prepareStatement(sql);                rs = stat.executeQuery();        }catch(Exception e){                ........        }        ........}
?

?

?注册驱动,获取数据库连接,执行sql语句,一步一步的进行编码并且在需要更改数据库的时候会牵涉到具体代码的修改,你要知道在编译后的修改和运行时的参数修改是完全不一个概念的,其实我觉得这样还蛮好的,不像hibernate中创建sessionfactory获取session后直接进行数据库操作save,get之类的,说到这,为什么hiberbate中会如此简单的实现数据库的操作呢?我觉得这里就用到了facade模式,声明一下,这里主要是表明一种设计的结构(从分步到归一),而不是创建对象的方式,比如创建数据库连接以及对数据库的操作可以用如下代码:

?

public class FacadeJDBC{        Connection conn = null;        Statement stat = null;        ResultSet rs = null;        static{                ApplicationContext context = new ApplicationContext("xxx");//这里可以是用配置文件中获取到上下文环境        }        public FacadeJDBC(){                Class.forName(context.getBean("driver")).newInstance();                conn = DriverManager.getConnection(context.getProperty(url),context.getProperty(usr),context.getProperty(pws));        }        public void executeSQL(String sql){                stat = conn.prepareStatement(sql);                rs = stat.executeXXX();        }        public ResultSet getResult(){                return rs;        }

?在客户端调用的时候:

?

public class Clent{        /*用到facade模式的好处是你仅仅可以更改配置文件        **并且无需更改逻辑代码就可以达到你更改的目的        */        FacadeJDBC facade = new FacadeJDBC();        facade.execute(sql);        ResultSet rs = facade.getReslut();        while(rs.next()){                //code        }}

?我这里没有用到factory,懒嘛~~~当然,像spring,hibernate关于facade模式的应用比着复杂的多,其实设计模式还是很不错的,锻炼自己设计的能力。

?

读书人网 >软件开发

热点推荐