首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

深入显出设计模式八——Facade模式(结构型)

2012-10-27 
深入浅出设计模式八——Facade模式(结构型)外观模式定义:外观模式:提供一个统一的接口,用来访问子系统中的一

深入浅出设计模式八——Facade模式(结构型)

外观模式定义:

外观模式:提供一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高级接口,让子系统更容易使用.

?UML图:

深入显出设计模式八——Facade模式(结构型)

一个典型的例子就是家庭影院系统:

如果想看电影可能需要用到多个子系统:如:电源开关,电视机开关,碟片机开关,灯光开关等等接口.

那么可不可以提供一个统一的接口给我,我可以通过watchMovie方法就可以完成所有子系统的功能呢?

可以定义一个接口,并通过组合的方式将所有子系统接口的方法在WatchMovie()中调用.

这样只要把实例化好的接口传给这个统一的接口对象就可以了.

同样可以进行close操作.

类似的在进行数据库操作时我们一般要提供一个DbUtil类,其实就是做了一个统一的接口让业务层进行调用.这也是Facade的一个示例.

如JDBC做数据库查询时候,如果面向的是多个不同类型的数据库开发。。

package com.lwf.object.facade;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public abstract class Facade {Connection conn = null;Statement stmt = null;ResultSet rs = null;String sqlStr = "";abstract void getConnection();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();}}}

?

?

package com.lwf.object.facade;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class MySQL extends Facade{public MySQL(){}public void getConnection() {try {Class.forName("org.postgresql.Driver");conn = DriverManager.getConnection("jdbc:postgresql://localhost/GACO","admin","passwd");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}}

?

?

package com.lwf.object.facade;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class TestFacade {public static void main(String[] args) {String sqlStr = "select * from "user"";String sqlStr1 = "select * from company";Facade m = new MySQL();try {m.doQuery(sqlStr);m.doQuery(sqlStr1);while(m.rs.next()){System.out.println(m.rs.getString(3));}} catch (Exception e) {e.printStackTrace();} finally{m.close();}}}

?

外观模式的意图就是提供一个简单的接口,从而让我们的子系统更易于使用.

?

最少知识原则:只和你的密友谈话

意思当我们设计系统的时候要尽量减少对象间的交互,只留下几个密友.就是不要让太多的类耦合在一起,从而避免了修改系统的一部分功能会影响其它的功能.从而减少了维护的花费.

方针:

对象的方法应该只调用 :

1.对象本身

2.被当作方法参数而传进来的对象

3.此方法所创建或实例化的对象

4.对象的组件:理解为通过组合的其它对象.has-a

如类:

public class Test{      private Watch watch;      private float getWatchFloat(){            return watch.getWatch().getFloat();      }}

?上面方法调用中优化一下,应该在Watch中加入getFloat方法

热点排行