对象创建链式模式

时间:2015-09-08 12:48:06

标签: c# xml design-patterns

我有一个结构复杂的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文件,而是创建了一种对象图。每个主标签由一个类表示。例如

Class 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
  }
}

1 个答案:

答案 0 :(得分:0)

您可以使用复合图案

我不是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();
            }

        }