15.2 前期准备:实例所用数据模型说明
15.2.1 建立国家实体和城市实体
为了编写TreeViewer的实例,要改造一下原来用在TableViewer的数据模型,在原有数据模型的基础上再增加两个实体类:国家和城市。国家包含城市,城市包含人。以下给出国家和城市的实体类代码,代码风格与原有的PeopleEntity类似。
//国家的实体类
public class CountryEntity {
private Long id; //唯一识别码,在数据库里常为自动递增的ID列
private String name; //国家名
private List<CityEntity> cities = new ArrayList<CityEntity>(); //此国家所包含的城市的集合
//---------两个构造函数---------
public CountryEntity() {}
public CountryEntity(String name) { this.name = name; }
//---------字段相应的Getter/Setter方法---------
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void setChildren(List<CityEntity> children) {this.cities = children;}
public List<CityEntity> getChildren() {return cities;}
}
//城市的实体类
public class CityEntity {
private Long id; //唯一识别码,在数据库里常为自动递增的ID列
private String name;//城市名
private List<PeopleEntity> peoples = new ArrayList<PeopleEntity>();//城市中的人
//---------两个构造函数---------
public CityEntity() {}
public CityEntity(String name) {this.name = name;}
//---------字段相应的Getter/Setter方法---------
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name;}
public void setName(String name) {this.name = name;}
public void setChildren(List<PeopleEntity> children) {this.peoples = children;}
public List<PeopleEntity> getChildren() {return peoples;}
}
//为了以后生成对象方便,给PeopleEntity类多加一个构造函数
public PeopleEntity() {}
public PeopleEntity(String name) { this.name = name; }
15.2.2 建立树结点的接口类
树结点有两个基本特征:名称和子结点。本书将这两个特征抽象出来写成一个接口,然后将要做树结点的实体类实现此接口。注意:这个接口不是必需的,仅是为了今后操作方便,及规范化设计才建立的。
//树结点的接口。接口名称一般以大写的I开头,第二个字母也大写
public interface ITreeEntry<T> { // 这里的T是JDK5.0泛型功能的用法
public String getName(); //设置树结点的名称
public void setName(String name); //得到树结点的名称
public void setChildren(List<T> children); //设置子结点集合
public List<T> getChildren(); //得到子结点集合
}
15.2.3 让国家、城市、人3个实体类实现此接口
国家、城市与人的关系如图15.2所示。

图15.2 实体类与接口的关系图
在实体类的起始处加“implements ITreeEntry<子实体>”,以表明此类实现于接口ITreeEntry,3个实体类的修改示意如下:
public class CountryEntity implements ITreeEntry<CityEntity> {
public class CityEntity implements ITreeEntry<PeopleEntity>{
public class PeopleEntity implements ITreeEntry{
接着就要实现接口定义的方法,不过原来在国家和城市的实体类已经实现了这两种方法(当初在设计这两个实体类时,笔者就考虑到了这一点。正常设计顺序应该是先设计接口,再完成实现类)。人的实体类还没有这两种方法,但“人”在本例中是不会有子结点的,所以就让它的这两种方法空实现。
//人实体。由于人不会有子结点,所以这两种方法无用,让它空实现
public List getChildren() { return null;}
public void setChildren(List children) {}






