H-DTO模式(之二)

类别:编程语言 点击:0 评论:0 推荐:

1、概述

    前文说明了一些基本的概念和设计思路,从UML图中可以看出很多的内容,比如类关系,组件关系,下文将要使用JAVA实现第一部分的设计

2、实现TransFormData

/*

 * Created on 2004-7-21 by Jem.Lee

 *

 * TransFormData is a part of cn.bs.common.transdata

 * ALL RIGHTS RESERVED.

 * COPYRIGHT (C) 2004. Jem.Lee

 */

 

/* 包路径cn.bs.common.transdata*/

package cn.bs.common.transdata;

 

/*Import包内容*/

import java.util.HashMap;

import java.util.Iterator;

 

 

/**

 * <PRE>

 * History

 * 2004-7-21 21:02:57 created by Jem.Lee

 *

 * 目的

 * 作为视图和控制器之间进行数据传递的主要对象,

 * 它包涵一般的元素对象和Table对象

 * </PRE>

 */

public class TransFormData implements Cloneable{

   

    /*

     * 存放单个元素的Hash表

     */

    private  HashMap trselements = new HashMap();

    /*

     * 存放Table元素的的Hash表

     */

    private  HashMap trstables = new HashMap();

   

    /**

     *  <PRE>

     * 从FormData获得指定元素名称的值

     * @param name 元素名称

     * @return 元素对应的值

     * @throws Exception

     *  </PRE>

     */

    public String getFieldValue(String name) throws Exception {

        return(this.getFieldFromName(name).getValue());

    }

   

    /**

     *  <PRE>

     * 从FormData获得指定元素域名称

     * @param name 元素名称

     * @return 元素对应的域

     * @throws Exception

     *  </PRE>

     */

    public TransFormField getFieldFromName(String name) throws Exception {

        if (name == null) {

            throw (new NullPointerException("输入的域名为空或是null"));

        }

        TransFormField ret = (TransFormField) trselements.get(name);

        if (ret == null) {

            throw (new Exception("找不到对应'" + name + "'域名"));

        }

        return (ret);

    }

     

    /**

     *  <PRE>

     * 给FormData指定一个元素并设置它的值,如果发现该元素已经存在,则覆盖该元素。

     * @param name  元素的名称

     * @param value 元素的值

     *  </PRE>

     */

    public void putFieldValueO(String name, String value){

        TransFormField newElement = new TransFormField(name, value);

        newElement.setParent(this);

        this.putElementsO(newElement);

    }

   

    /**

     *  <PRE>

     * 设置FormData的Elevent域。

     * @param newElement 指定的新域

     *  </PRE>

     */

    public void putElementsO(TransFormField newElement){

        newElement.setParent(this);

        this.trselements.put(newElement.getName(), newElement);

    }

   

    /*------------------------------Table------------------*/

   

    /**

     * <PRE>

     * 增加Table到FormData中,并返回该Table的实例,如果指定的表已经存在,

     * 则抛出Exception例外

     * @param name  Table的名称

     * @return FormTable  所返回的Table类型

     * @throws Exception

     *  </PRE>

     */

    public TransFormTable addTable(String name) throws Exception{

        if(trstables.get(name) != null){

            throw(new Exception());

        }

        return(addTableO(name));

    }

   

    /**

     *  <PRE>

     * 增加Table到FormData中,并返回该Table的实例,如果该指定的表已经存在,

     * 则强行覆盖新的表。

     * @param name  Table的名称

     * @return FormTable  所返回的Table类型

     *  </PRE>

     */

    public TransFormTable addTableO(String tableName){

        TransFormTable newTable = new TransFormTable(tableName);

        newTable.setParent(this);

        trstables.put(tableName, newTable);

        return(newTable);

    }

   

    /**

     *  <PRE>

     * 对Table的内容进行排序

     *  </PRE>

     */

    void sortTable(){

        Iterator iTables = this.trstables.keySet().iterator();

        while(iTables.hasNext()){

            TransFormTable tbl = (TransFormTable) this.trstables.get(iTables.next());

            tbl.sort();

        }

    }

   

    /**

     *  <PRE>

     * 获得指定表名称的实例

     * @param name  表名称

     * @return 指定表名称的实例

     * @throws BsComponentException、NullPointerException、IllegalArgumentException

     *  </PRE>

     */

    public TransFormTable getTable(String name) throws Exception {

        if (name == null) {

            throw (new NullPointerException("输入的表名是null"));

        }

        if (name.equals("")) {

            throw (new IllegalArgumentException("输入的域名为空"));

        }

        TransFormTable ret = (TransFormTable) trstables.get(name);

        if (ret == null) {

            throw (new Exception());

        }

        return(ret);

    }

}

 

 

3、实现TransFormField

/*

 * Created on 2004-7-21 by Jem.Lee

 *

 * TransFormField is a part of cn.bs.common.transdata

 * ALL RIGHTS RESERVED.

 * COPYRIGHT (C) 2004. Jem.Lee

 */

 

/* 包路径cn.bs.common.transdata*/

package cn.bs.common.transdata;

 

/**

 * <PRE>

 * History

 * 2004-7-21 21:03:26 created by Jem.Lee

 *

 * 目的

 * 作为视图和控制器之间进行数据传递的主要对象,

 * 它作为一般的元素对象

 * </PRE>

 */

public class TransFormField {

 

    /*

     * 元素名称

     */

    private String name;

 

    /*

     * 元素值

     */

    private String value;

 

    /*

     * 存放该元素得父目录

     */

    private TransFormData parent;

   

    /**

     *  构造函数

     * @param initName 元素名称

     * @param initValue 元素值

     */

    public TransFormField(String initName, String initValue) {

       

        /*如果提供的元素名称为null则抛出NullPointerException例外*/

        if (initName == null)

            throw (new NullPointerException("初始化FormField时提供的参数错误,比如其中initName为null"));

       

        /*如果提供的元素名称为空则抛出IllegalArgumentException例外*/

        if (initName.equals(""))

            throw (new IllegalArgumentException("初始化FormField时提供的参数错误,initName为空"));

       

        /*如果提供的元素值为null则抛出NullPointerException例外*/

        if (initValue == null)

            throw (new NullPointerException("初始化FormField时提供的参数错误,initValue为null"));

       

        this.name = initName;

        this.value = initValue;

    }

    /**

     * <PRE>

     * 获得元素名称

     * @return 元素名称

     * </PRE>

     */

    public String getName(){

        return(this.name);

    }

   

    /**

     * <PRE>

     * 获得元素的值

     * @return 元素的值

     * </PRE>

     */

    public String getValue(){

        return(this.value);

    }

   

    /**

     * <PRE>

     * 设置元素的父目录

     * @param newParent 父目录

     * </PRE>

     */

    public void setParent(TransFormData newParent){

        /*如果父目录为null,则抛出NullPointerException例外*/

        if(newParent == null)

            throw (new NullPointerException("设置FormField的包容类FormData错误,比如为null"));

        this.parent = newParent;

    }

 

 

}

 

 

4、实现TransFormRecord

/*

 * Created on 2004-7-21 by Jem.Lee

 *

 * TransFormRecord is a part of cn.bs.common.transdata

 * ALL RIGHTS RESERVED.

 * COPYRIGHT (C) 2004. Jem.Lee

 */

 

/* 包路径cn.bs.common.transdata*/

package cn.bs.common.transdata;

 

/**

 * <PRE>

 * History

 * 2004-7-21 21:03:44 created by Jem.Lee

 *

 * 目的

 * 作为视图和控制器之间进行数据传递的主要对象,

 * 它作为Table对象的元素对象

 * </PRE>

 */

public class TransFormRecord  extends TransFormData implements Comparable{

   

    /*

     * 记录 ID

     */

    private int rec_Id;

 

    /*

     * 存放该元素得父目录

     */

    private TransFormTable parent;

   

 

    public int compareTo(Object target) {

        if(target instanceof TransFormRecord)

            return(rec_Id-((TransFormRecord)target).getRecId());

        return(0);

    }

    /**

     * <PRE>

     * 设置元素的父目录

     * @param newParent 父目录

     * </PRE>

     */

    void setParent(TransFormTable newParent){

        parent = newParent;

    }

    /**

     * <PRE>

     * 获得元素的父目录

     * @return FormTable 父目录

     * </PRE>

     */

    TransFormTable getParent(){

        return(parent);

    }

   

    /**

     *

     * <PRE>

     * 设置 新的记录ID

     * @param newId 记录ID

     * </PRE>

     */

    void setRecId(int new_Id){

        rec_Id = new_Id;

    }

   

    /**

     *

     * <PRE>

     * 获得的记录ID

     * @return 记录ID

     * </PRE>

     */

    int getRecId(){

        return(rec_Id);

    }

}

 

 

5、实现TransFormTable

/*

 * Created on 2004-7-21 by Jem.Lee

 *

 * FormTable.java is a part of cn.bs.common.transdata

 * ALL RIGHTS RESERVED.

 * COPYRIGHT (C) 2004. Jem.Lee */

 

/* 包路径cn.bs.common.transdata*/

package cn.bs.common.transdata;

 

/*Import包内容*/

import java.util.ArrayList;

import java.util.Collections;

import java.util.Iterator;

 

/**

 * <PRE>

 * History

 * 2004-7-21 21:04:00 created by Jem.Lee

 *

 * 目的

 * 作为视图和控制器之间进行数据传递的主要对象,

 * 它作为FormData对象的元素对象

 * </PRE>

 */

public class TransFormTable {

   

    /*

     * Table 名称

     */

    private String name;

 

 

    /*

     * 记录数组

     */

    private ArrayList records = new ArrayList();

 

    /*

     * 存放该元素得父目录

     */

    private TransFormData parent;

   

    /**

     *  <PRE>

     * 构造函数 提供表名称

     * @param initName 表名称

     *  </PRE>

     */

    public TransFormTable(String initName) {

        /*如果提供的表名为null,则抛出NullPointerException例外*/

        if (initName == null)

            throw (new NullPointerException("构造FormTable时错误,比如表名为null"));

       

         /*如果提供的表名为空,则抛出NullPointerException例外*/

        if (initName.equals(""))

            throw (new IllegalArgumentException("构造FormTable时错误,比如表名为空"));

       

        this.name = initName;

    }

    /**

     * <PRE>

     * 设置元素的父目录

     * @param newParent 父目录

     * </PRE>

     */

    void setParent(TransFormData newParent) throws NullPointerException {

        /*如果提供的父目录为null,则抛出NullPointerException例外*/

        if (newParent == null)

            throw (new NullPointerException("设置ForFormTablemField的包容类FormData错误,比如为null"));

       

        this.parent = newParent;

    }

    /**

     *

     * <PRE>

     * 加入一条记录到Table

     * @return 返回该条记录的实例,以便进行赋值操作

     * </PRE>

     */

    public TransFormData add() {

        TransFormRecord newRec = new TransFormRecord();

        newRec.setParent(this);

        records.add(newRec);

        reIndex();

        sort();

        return (newRec);

    }

    /**

     *

     * <PRE>

     * 排序函数,对表的记录进行排序

     * </PRE>

     */

    void sort() {

        Collections.sort(records);

        Iterator iRecs = records.iterator();

        while(iRecs.hasNext()){

            TransFormData rec = (TransFormData) iRecs.next();

            rec.sortTable();

        }

    }

   

    /**

     *

     * <PRE>

     * 记录索引

     * </PRE>

     */

    void reIndex() {

        int index = 0;

        //Collections.sort(recs);

        Iterator i = records.iterator();

        while (i.hasNext()) {

            TransFormRecord rec = (TransFormRecord) i.next();

            rec.setRecId(index);

            index++;

        }

    }

   

    /**

     *

     * <PRE>

     * 通过记录号获得一条记录

     * @param recNo 记录号

     * @return 一条记录

     * </PRE>

     */

    public TransFormData get(int recNo) {

        return ((TransFormData) records.get(recNo));

    }

   

    /**

     *

     * <PRE>

     * 获得表的长度

     * @return 表的长度

     * </PRE>

     */

    public int size() {

        return (records.size());

    }

 

 

}

 

6、总结
    到这里,我把H-DTO模式做了简要介绍,希望对你的设计有些帮助,如果发现错误之处还请批评指正,如果有疑问或是不明之处欢迎讨论。

 

 

本文地址:http://com.8s8s.com/it/it26459.htm