阅读本文,你必须已经使用过至少一种xml类库如dom4j,jdom等。
Shark对于每一个标签的映射类提供一个fromXML(Element element)方法(从xml的标签中填充属性值)。
然后我们用以下两个类描述一下之间的协作:
<workflow-process>标签对应WorkflowProcess(流程)类。
<workflow-activity>标签对应WorkflowActivity(活动)类。
<workflow-process>标签中包含一系列<workflow-activity>标签,也就是说WorkflowProcess中是这样定义的:
public class WorkflowProcess
{
private String name = ""; // 流程名称
private List activities = new ArrayList(); // 列表的元素是WorkflowActivity
// 接着看fromXML的操作
public void fromXML(Element element)
{
// 先处理本类所需要的非集合型的属性
name = element.attribute ("name").getValue(); //获得参数name的值<workflow-process name="名字">
// 其他非集合型的属性略
// 处理集合型的属性
List activityElements = element.getChildElements("workflow-activity"); // 获得流程标签<workflow-process>下所有活动子标签<workflow-activity>
for (int i = 0; i < activities.size(); i++)
{
Element activityElement = (Element)activityElements.get(i);
WorkflowActivity activity = new WorkflowActivity();
activity.fromXML(activityElement); // 让活动调用自己的从xml填充属性值方法
activities.add(activity); // 构造完毕,添加到活动列表
}
}
}
这样,每个类负责自己属性的填充,职责明确。
另外,如果你使用了类继承,子类可以直接调用父类的方法,仅负责子类特有的属性,这样只关注自身的特性,符合现实,将使程序更易懂。
p.s.
shark的这套设计和我写的文档有些不同,但是我为了简单易懂,把他简化了。
还有虽然方法返回void,但我认为返回一个对象比较好。也可以写成static,就成为一个构造函数,可以追追潮流,我们叫他xml factory method好了 :D