5.6 外观模式(4.5)

外观模式(façade pattern)是门面型委派方式,它将减少客户对服务细节的了解。

应用程序中有大量的类,它们分工合作。从更大的颗粒度看,类组成包,包组成子系统(subsystem)。对外界的客户类而言,整个子系统可以被视为一个服务机构,客户不一定希望和所有的类打交道,而仅仅希望与服务机构交互。表示整个子系统这个服务机构,称为外观类(Facade)。外观类为客户类与整个子系统的交互定义了(高层)接口。

一个大家熟知的例子,是JDBC。有人希望使用JDBC提供的所有类的所有方法;但是,做简单系统的人,常常不希望自己的DAL层代码使用太多的JDBC类,更不喜欢处理没完没了的异常。于是,有人将自己常用的类和方法加以封装,形成自己的JDBC门面

门面类常常作为程序员的私房菜——工具类。一个框架如JDBC的设计者,千万不要设计门面,你要知道众口难调。使用者需要了解你的门面包含了那些,重要的是不包含那些东西,这不是自己找喷吗。大笑


你可以参考的例子。yqj2065的JDBC门面。包含两个类DBTable和HsqldbConn。

package DAL;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 封装ResultSet、ResultSetMetaData接口的门面。取名DBTable——数据库表
 * 
 * @author yqj2065
 */
class DBTable {
    ResultSet rs;
    ResultSetMetaData rsmd;
    int colCount;//列数

    public DBTable(ResultSet rs) {
        this.rs = rs;
        try {
            rsmd = rs.getMetaData();
            colCount = rsmd.getColumnCount();
        } catch (SQLException e) { }
    }

    /**
     * 获得字段名数组
     * @return 
     */
    public String[] getColNames() {        
        String[] names = new String[colCount];
        try {
            for (int i = 0; i <= colCount; i++) {
                names[i] = rsmd.getColumnName(i+1);
            }
        } catch (SQLException e) {
        }
        return names;
    }

    /**
     * 
     * @return 
     */
    public boolean hasNext() {
        try {
            return rs.next();
        } catch (SQLException e) {
            return false;
        }
    }

    /**
     * 学习java.lang.Iterable而非ResultSet的命名。
     * @return 字符串数组形式的一条记录。
     */
    public String[] next() {
        String[] row = new String[colCount];
        try {
            for (int i = 0; i <= colCount; i++) {
                row[i] = rs.getString(i+1);//为什么基于1
            }
        } catch (SQLException e) {
        }
        return row;
    }

    public String getFieldValue(String columnName) {
        String value = "";
        try {
            value = rs.getString(columnName);
        } catch (SQLException e) {
        }
        return value;
    }

    public String getFieldValue(int i) {
        String value = "";
        try {
            value = rs.getString(i);
        } catch (SQLException e) {
        }
        return value;
    }

    //----------------------------------------------
    @Override public void finalize() {
        try {
            rs.close();
        } catch (SQLException e) {
        } finally {
            try {
                super.finalize();
            } catch (Throwable ex) {
                Logger.getLogger(DBTable.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值