读书人

Facade外观方式

发布时间: 2012-10-08 19:54:56 作者: rapoo

Facade外观模式
学Facade模式的时候看了好几本书,还是感觉没太搞懂它。

Facade外观模式 给复杂的子系统提供运用它部分功能的接口,使子系统更加容易使用
开始之前先说一点:设计模式中说的接口并不是传统意义上的接口interface,它可以是面向对象语言的接口,也可以是抽象类,甚至是一个普通的类,下面的要讲的Facade模式就很好地体现了这一点。关于设计模式的接口,我的理解是模块之间的规约,通过规约可以使两个模块分离。使系统间的通信和相互依赖关系达到最小。
图示:
->

概念有点难理解,先举一个现实的例子:
比如说计算机系统由硬件系统和软件系统组成,我们使用计算机时,只需要通过鼠标和键盘等操作,并不需要知道计算机内部是怎么工作的,因为计算机系统实在是太复杂了。这里我们看到的计算机就是内部系统的外观(facade)。

值得注意的地方
1.只需要使用某个复杂系统的子集(部分功能) 比如说你用计算机的时候不可能一次性把它全部的功能都使用。
2.除了可以使用系统的原有功能之外,还可以提供新功能

我们在写JSP中会与JDBC连接,在jsp中一个可能的写法是

//Facade类,将客户连接JDBC的请求代理给Connection等适当的子系统对象public class ConnDB {//需要的子系统对象private Connection conn;private Statement stmt;private ResultSet rs;//实现子系统的部分功能——查询public List<Object> getAllObj(){List<Object> objList = new ArrayList();try {init();stmt = conn.createStatement();rs = stmt.executeQuery("select * from xxx");while(rs.next()){Obj = new Obj();Obj.setXXX(rs.getXXX);....}} catch (Exception e) {e.printStackTrace();}return objList;}//实现客户需要的子系统的其它功能……//除了可以使用系统的原有功能之外,还可以提供新功能//比如说得到运行日期public Date getDate(){return new Date(System.currentTimeMillis());}//初始化public void init(){try{Class.forName("com.mysql.jdbc.Driver").newInstance();conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/blog", "root", "123") ;}catch(Exception e){e.printStackTrace();}}//关闭资源public void close(){try{if(conn!=null)conn.close();if(stmt!=null)stmt.close();if(rs!=null)rs.close();}catch(Exception e){e.printStackTrace();}}}

然后在jsp中使用者就可以通过创建ConnDB类,再调用需要的方法就行了,这时对使用者来说就不需要知道连接的细节了。
这里举的例子所用的子系统都是别人写的,当我们在协同开发的时候完全可以由自己来写系统

优点:
1.子系统使用方便
2.实现了子系统与客户之间的松耦合关系
3.可以添加新功能
4.协同开发的时候,可以这样:一个人把facade接口的api交给另外一个人,让另外一个人去调用,分工明确。

读书人网 >编程

热点推荐