请教各位:
我怎么样把这个XML文件结构用组合模式(Composite Pattern)来表示呢?
<?xml version="1.0" encoding="utf-8" ?>
<ReportTemplate CustomerName="normal" Version="0.92">
<Reports>
<Report FontName="Tahoma" FontSize="12" ReportName="Account" Width="3.9" LeftSpacing="0.1" TopSpacing="0.1" EndOfDayFlag="false">
<Header FontSize="0" FillColor="DarkGray">
<Lines>
<HeaderTextLine FontSize="16" LineTitle="REPORTNAME" TitleWidth="0" DataSource="Account" Format="{0}" />
<HeaderTextLine FontSize="12" LineTitle="Store Name:" TitleWidth="0" DataSource="StoreName" Format="{0}" />
</Lines>
</Header>
<Bodys>
<ReportBody FontSize="0" HeadingHeight="0.25" HeadingFillColor="LightGray" HeadingLines="2">
<ColumnHeadings>
<ColumnHeading FontSize="0" Height="0.25" Width="0.8" FirstLineName="Date" SecondLineName="" HoriAlignment="Left" />
<ColumnHeading FontSize="0" Height="0.25" Width="1" FirstLineName="Transaction Type" SecondLineName=""
HoriAlignment="Left" />
</ColumnHeadings>
<DataColumns>
<Column FontSize="0" Height="0" Width="0.8" DataSource="TransDate" Format="{0:d}" SummaryType="None"
HoriAlignment="Left" />
<Column FontSize="0" Height="0" Width="1" DataSource="EntryType" Format="{0}" SummaryType="None"
HoriAlignment="Left" />
</DataColumns>
</ReportBody>
</Bodys>
</Report>
.........
</ReportTemplate>

解决方案 »

  1.   

    接口为IXMLItem
    子类为 XMLNode 和 XMLProperty
    XMLNode 可以组合(包含)XMLNode 或 XMLProperty, XMLProperty 不可以组合其他对象。
      

  2.   

    to:zahuifan(杂烩饭)能解释一下XMLNode和 XMLProperty分别代表什么意思吗?具体怎么样实现组合模式(Composite Pattern)的呢?
      

  3.   

    组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
    我只是为了练习,我还想问一下,我的XML文件是报表配置文件,在真正的程序中有必要把这个配置文件实现组合模式(Composite Pattern)吗?有没有好处呢?
      

  4.   

    组合模式(Composite Pattern)最本质的一个概念是对象集合能表达成一棵树。对于你的问题来讲:1.如果你从XML角度来讲,这个XML文件是可以表达成一个组合模式。比如NET的XML的DOM模型,本身就是一个组合模式。比如XmlNode,就是所有XML节点的抽象基类。然后继承了XmlNode的类比如XmlElement,xmlAttribute都继承它,来表达成一个对象树。
    2 但是从业务的角度来讲。你这个Xml表达的是报表模板。从你的XMl中,我没有看到一个报表可以包含子报表集合。所以不是一棵报表树。没有必要用到什么组合模式。有一点要说的:数据库,XML这些都只是数据存储与交换的一种方式。它们不应该影响到你的类设计。你并不能从它们之中能看到类设计的影子。而且不能被它们所制约。有没有好处呢?组合模式的好处很多。比如你的有报表类,里面有很多子报表。那么你的客户应用程序就可以用一致的方式来调用你的报表类的方法。比如Render方法。这种贴这么人气这么低。唉。NETER怎么对这些都不关心呢????这可是搞软件开发最要追求的东东哦!
      

  5.   

    是啊,都这么长时间了,没有人回啊!谢谢你的回答。正如你所说,组合模式(Composite Pattern)最本质的一个概念是对象集合能表达成一棵树。
    但是我的XML中有对象集合的概念阿!可以有多个reports,
    比如,有header有lines
    可以有多个bodys,
    然后还可以有ColumnHeadings, 有DataColumns我想统一处理集合对象,应该就是组合模式的应该做的事情吧!但是,的确没有递归的概念,请问组合模式一定要有递归才能用吗?你说的
      

  6.   

    多谢zhongkeruanjian(编程亮子)的点拨,的确我的理解有误,递归的概念在组合模式中很重要,其实我的疑问是组合模式可以处理这种没有递归概念,但是的确有树型概念的模型吗?
      

  7.   

    唉,是啊。这就是国内做NET永远都做不了大事的原因吧。推荐你到www.cnblogs.com去看看,里面有几个研究这方面的高手,比如杜震宇,Terrylee。这里只是灌水乐园。
      

  8.   

    to:zhongkeruanjian(编程亮子) 谢谢你的提醒。
    不知道你看过李建忠老师的设计模式视频,如果没有到这里:
    http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD.aspx
    你应该看过吧!如果没有,就当是我谢谢你了。
      

  9.   

    递归与组合模式没有必然的联系。。回到你的问题上来。你的理解是可以的!因为你把他们都看成了一个抽象节点。其他节点继承这个节点。然后统一处理这些节点。这就是强类型的NET的DOM模型。呵,我想远了,我以为你想把报表做成组合模式。哈哈。
      

  10.   

    to:zhongkeruanjian(编程亮子)非常感谢你的回答,帮我加深了对组合模式的理解。
    以前我的确忽略了组合模式的递归,不过我想你明白了我的意思,我也明白你的意思了。
    呵呵!分是你的了。