对象创建链接模式

本文关键字:模式 链接 创建 对象 | 更新日期: 2023-09-27 18:11:55

我有一个结构复杂的XML文件。以下只是一个小样本。

    <MainTag>
        <Tag1 name="">
            <SubTag1_1 msgType="">
            <SubTag1_2 storeId="abc" abc=""/>
            </Tag1>
            <Tag2 msgType="">
                <SubTag2_1 name="" cap="" value="#"/>
                <SubTag2_2=""/>
            </Tag2> 
        </Tag1>
        <Tag3 name="">
            <SubTag3>
                <SubTag3_1 msgType="A" value="1">
                    <SubSubTag3 name="" xml="" sap="" time_delta="0" time_absolute="2"/>
                    <SubSubTag3 name="" xml="" sap="" type="transmit" time_delta="5" time_absolute="2"/>
                </SubTag3_1 >
                <SubTag3_2 msgType="" value="1">
                    <SubSubTag3 name="" xml="" sap="" type="receive" time_delta="0" time_absolute="2"/>
          </SubTag3_2>
      </SubTag3>
   </Tag3>
</MainTag>

我必须为不同的数据集多次创建上述XML文件。我没有使用单个类来获取所有数据并编写XML文件,而是创建了一种对象图。每个主标签由一个类表示。例如

类MainTag将有类Tag1和Tag3的引用。Tag1类将引用子类SubTag1, Tag2等。此外,每个类都实现了IXmlSerializable接口,这使得编写XML文件非常容易,而且划分得很好。如果更改了XML结构,划分类也会有所帮助。

问题:

1)将XML结构划分为一组类的方法正确吗?

2)因为我有很多类,我必须初始化所有的类结构(对象图)。一旦数据(我想在xml中插入)准备好了,我想开始整个对象图的初始化。初始化完成后,我只想使用IXmlSerializable接口编写XML。对于我正在使用的这种对象初始化,是否存在任何设计模式?目前,我正在做以下工作。这看起来很奇怪。

class MainTag: XmlBase
{
    List<Tag1> Tag1List{ get; set; }
    Tag1 t;
    public MainTag() : base()
    {
       t = new Tag1();
       //Do processing and populate the properties of MainTag
    }
}
class Tag1 : XmlBase
{
  List<SubTag1_1> subtags;
  SubTag1_1 s;
  public Tag1()
  {
      s = new SubTag1_1();
      //Do processing and populate the properties of Tag1
  }
}

对象创建链接模式

您可以使用复合模式

我不是c#开发人员,但是您可以为您拥有的每种标记类型创建一个XMLTag类和一个继承自XMLTag的CompositeXMLTag来聚合XMLTag对象。

然后创建一个类来初始化标签树

有关复合模式的更多信息http://www.codeproject.com/Articles/185797/Composite-Design-Pattern

编辑:我不是c#开发人员,所以这里有一个java示例
public interface CompositeXMLTag {
    public void addTag(CompositeXMLTag tag);
    public void serialize();
}

public class Tag1 implements CompositeXMLTag {
    private List<CompositeXMLTag> tags = new ArrayList<CompositeXMLTag>();
    private String name;
    /* getters and setters */
    @Override
    public void addTag(CompositeXMLTag tag) {
        this.tags.add(tag);
    }
    @Override
    public void serialize() {
        for (CompositeXMLTag compositeXMLTag : tags) {
            compositeXMLTag.serialize();
        }
    }
}
public class SubTag1_1 implements CompositeXMLTag{
    private List<CompositeXMLTag> tags = new ArrayList<CompositeXMLTag>();
    private String storeId;
    private String abc;
    /* getters and setters */
    @Override
    public void addTag(CompositeXMLTag tag) {
        this.tags.add(tag);
    }
    @Override
    public void serialize() {
        for (CompositeXMLTag compositeXMLTag : tags) {
            compositeXMLTag.serialize();
        }
    }
}
public class Client {
           public static void main(String[] args) {
                CompositeXMLTag tag1 = new Tag1();
                tag1.addTag(new SubTag1_1());
                tag1.serialize();
            }
        }