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模式做了简要介绍,希望对你的设计有些帮助,如果发现错误之处还请批评指正,如果有疑问或是不明之处欢迎讨论。