锁定老帖子 主题:设计模式(七)——门面模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-07-10
设计模式(七)——门面模式
门面模式(facade pattern),又称外观模式,为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,就是把一堆复杂的流程封装成一个接口供给用户更简单的使用,这个设计模式里有三个角色: 1)门面角色( facade ):这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
好了,老规矩,假设一个场景,这里说句题外话,在我写这个玩意的时候,每当我假设某个场景的时候,比如什么造汽车,卖水果的场景,我旁边同事就很鄙视的说,不要搞这些没意义的场景,什么卖西瓜造汽车,造你妹啊,叼用都没有的代码,你这误导新人,说的十分激动义愤填膺,我说,我这是为了说明这设计模式的思想,所以我才选一些生活中常用的场景而不引人一些复杂的模型嘛,关键是让别人理解这个思想嘛,要让大家举一反三,我又不是为了写个具体有用的代码让他copy过去直接用的。他说,诡辩,滚~ 不过我觉得给他一次机会,所以这次我写个有用点的场景。是这样,门面模式最常见也最有效的一个写法就在jdbc连数据库时,我们知道连接一个数据库,要先加载驱动,获得连接,获得statement,然后执行操作,最后关闭连接,步骤顺序都不能变,如果每次执行都要自己写这些,那真的会蛋蛋疼,所以,我们把这些都封装起来,如下: 先建立我们的门面,但是我们改进下,我们把这个门面写成抽象的,这样扩展性更好:
package com.gy.designpattern.facade; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * ClassName:DBFacade <br/> * Function: 抽象的数据库门面. <br/> * Reason: 这样可以使用这个连接上不同类型的数据. <br/> * Date: 2012-7-10 上午10:51:35 <br/> * @author gongyong * @version * @since JDK 1.6 * @see */ public abstract class DBFacade { Connection conn = null; Statement stmt = null; ResultSet rs = null; String sqlStr = ""; //获取数据库连接 abstract void getConnection(); //创建statement public void createStatement() { try { stmt = conn.createStatement(); } catch (SQLException e) { e.printStackTrace(); } } //执行查询操作 public void executeQuery(){ try { rs = stmt.executeQuery(sqlStr); } catch (SQLException e) { e.printStackTrace(); } } //封装之前三个必须操作 public void doQuery(String sqlStr){ this.sqlStr = sqlStr; getConnection(); createStatement(); executeQuery(); } public void close(){ try { rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
然后我们具体实现这个门面,我们用mysql数据库:
package com.gy.designpattern.facade; import java.sql.DriverManager; /** * ClassName:MysqlUtil <br/> * Function: mysql数据库门面的具体实现. <br/> * Reason: TODO ADD REASON. <br/> * Date: 2012-7-10 上午10:54:46 <br/> * @author gongyong * @version * @since JDK 1.6 * @see */ public class MysqlUtil extends DBFacade{ /** * 注入数据库驱动并连接上指定的数据库. * @see com.gy.designpattern.facade.DBFacade#getConnection() */ @Override void getConnection(){ try{ Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456"); }catch(Exception e){ e.printStackTrace(); } } }
到这里门面已经完成了,看怎么用吧:
package com.gy.designpattern.facade; import java.sql.SQLException; /** * ClassName:Client <br/> * Function: 客户端,用来操作数据库. <br/> * Reason: TODO ADD REASON. <br/> * Date: 2012-7-10 上午10:58:05 <br/> * @author gongyong * @version * @since JDK 1.6 * @see */ public class Client { public static void main(String[] args){ //sql语句 String sqlStr = "select * from user"; //先new出一个mysql数据库的操作工具,也就是门面 DBFacade dbFacade=new MysqlUtil(); try { //直接使用该门面中封装好的方法 dbFacade.doQuery(sqlStr); while(dbFacade.rs.next()){ System.out.print(dbFacade.rs.getString(2)); } } catch (SQLException e) { e.printStackTrace(); }finally{ dbFacade.close(); } } }
看吧,是不是封装之后再执行各种数据库的操作就很简单了,客户端完全不需要知道怎么连接数据库等等这些流程,他只需要new一个门面,调用对应的方法就可以了,是不是方面了许多,就是这样。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-07-10
把字弄那么小干嘛..看不清
|
|
返回顶楼 | |
发表时间:2012-07-12
kennykinte 写道 把字弄那么小干嘛..看不清 额,我猜你是近视吧 |
|
返回顶楼 | |
发表时间:2012-07-13
这个和模板方法有啥区别的?
|
|
返回顶楼 | |
发表时间:2012-07-13
hamber 写道 这个和模板方法有啥区别的? 嗯,这个问题好,马上我就会写到模板方法,到时再回答你这个问题哦 |
|
返回顶楼 | |
发表时间:2012-11-01
嗯,的确是这样,我最近也在写jdbc的语句,总是写重复的代码。可以考虑用下门面模式改进一下。新手学习了
|
|
返回顶楼 | |
发表时间:2013-06-26
这应该是模板模式吧。
|
|
返回顶楼 | |
浏览 6615 次