您的位置:首页 > Web前端 > JavaScript

实战设计模式之用组合模式实现JSON(七)

2009-01-14 10:10 471 查看
具体实现
[align=left] 我给项目起了个名,叫Nodous,这个单词很生僻,它是多节的意思,呵,顺便说一个,这个域名在我手里,.Com的,有要的吱个声哈,当然是要给钱的,呵呵,开玩笑哈。[/align]
[align=left] 另外这个版本的命名也有一些变更,希望读者能够适应。[/align]
[align=left] 前两章都没有类图,这章还是先上一个类图吧,有一个感性的认识。[/align]
[align=left] [/align]
[align=left] 看到这些可爱的棒棒糖(接口)没有,它简直是我们的大救星,我就针对这三张图来描述,我想说完了也就差不多了。[/align]
接口类



[align=left] 我们一共有四个接口,分别是INodousLeaf、INodousNode、INodousRoot、INodousItem,从命名我们就可以看出来,分别对应的叶子节点、普通节点、根节点、数组节点,细心的读者可能会看出来,咦,怎么少了一个数组子节点?没错,数组子节点从本质上来说,和普通节点并没有什么差别,对外的操作接口都是一样的。其实根节点和普通节也没有差别,不过根节点要多了两个方法,一个是Create,另一个是NodousToString。[/align]
叶子节点的接口:INodousLeaf
[align=left]叶子结点的接口很奇怪,它一个空接口,因为它没有对外的方法或属性[/align]
普通节点的接口:INodousNode
[align=left]INodousItem AddItem(string name);[/align]
[align=left]添加数组节点[/align]
[align=left]INodousNode AddNode(string name);[/align]
[align=left]添加普通节点[/align]
[align=left]INodousLeaf AddLeaf(string name, string value);[/align]
[align=left]添加叶子节点[/align]
[align=left]INodousLeaf SafeAddLeaf(string name, string value);[/align]
[align=left]安全添加叶子节点,这是一个很有意思的方法,它与AddLeaf不同的是,它认为value是安全的,不包含敏感字符,主要是针对Xml中使用的,因为我们知道XML对如“&,>”等符号是敏感,如果使用这个方法,叶子节点就被被添加为属性,否则就会被添加为CData结点。[/align]
根节点的接口:INodousRoot
[align=left]string NodousToString();[/align]
[align=left]返回已经创建的数据[/align]
[align=left]void Create();[/align]
[align=left]创建节点数据[/align]
[align=left] [/align]
[align=left]根节点继承了普通节点INodousNode,包含所有普通节的接口方法[/align]
数组节点的接口:INodousItem
[align=left]INodousNode AddItemNode();[/align]
[align=left]创建数组子节点[/align]
生成XML的类



[align=center]类图[/align]
[align=left] 除了抽象类XmlNodousComponent,所有的类都继承于XmlNodousComponent和对应的接口。[/align]
[align=left] 相对于生成JSON的功能,生成XML的功能要简单得多,因为微软已经为我们封装好了操作XML的功能。[/align]
抽象类:XmlNodousComponent
[align=left]protectedList<XmlNodousComponent> list;[/align]
[align=left]保存节点列表[/align]
[align=left]protectedbool isSafe = false;[/align]
[align=left]是否为安全的值,安全的值不包括Xml的敏感字符串[/align]
[align=left]protectedXmlElement parentElement;[/align]
[align=left]父级的Element[/align]
[align=left]protectedXmlDocument container;[/align]
[align=left]容器[/align]
[align=left]protectedstring name;[/align]
[align=left]节点名[/align]
[align=left]protectedstring value;[/align]
[align=left]节点的值[/align]
[align=left]publicXmlNodousComponent Parent { get; set; }[/align]
[align=left]父级节点,公开的属性[/align]
[align=left]protectedinternal XmlNodousComponent(string name, string value)[/align]
[align=left]构造函数,要求提供节的名称及节点的值[/align]
[align=left]protectedvoid Add(XmlNodousComponent c)[/align]
[align=left]添加节点[/align]
[align=left]protectedvoid Remove(XmlNodousComponent c)[/align]
[align=left]删除节点[/align]
[align=left]publicvoid RemoveAt(int index)[/align]
[align=left]根据索引删除节点[/align]
[align=left]protectedvoid Create()[/align]
[align=left]创建数据[/align]
[align=left]protectedvirtualvoid CreateNode()[/align]
[align=left]创建具体节点,这个方法其实是Create方法中分离出来的,因为有些节点节点需要重写里面的内容[/align]
[align=left] [/align]
[align=left] 和第二版相比,有了一些变动,把不需要对外使用的字段改为protected的变量。[/align]
根节点:XmlNodousRoot
[align=left]继承于XmlNodousNode和INodousRoot[/align]
[align=left] [/align]
[align=left]public XmlNodousRoot(string name)[/align]
[align=left]根节的构造函数[/align]
[align=left]protectedoverridevoid CreateNode()[/align]
[align=left]重载[/align]
[align=left]publicstring NodousToString()[/align]
[align=left]返回创建的数据[/align]
[align=left]publicnewvoid Create()[/align]
[align=left]继承于INodousRoot,创建数据,需要注意的是,这个方法有一个new的关键字,因为父类已经有了一个Create方法了,所以这里要用new关键字,要不然就变成重写了[/align]
[align=left] [/align]
[align=left]这里一定要注意,根节点不是继承于XmlNodousComponent,而是继承于XmlNodousNode,因为在实际操作中,普通节点与根节点是没有差别中,不同的只是普通节点多了Create和NodousToString方法,这样我们可以少写一大堆的重复方法。[/align]
普通节点:XmlNodousNode
[align=left]继承于XmlNodousComponent和INodousNode[/align]
[align=left] [/align]
[align=left]protectedinternal XmlNodousNode(string name) : base(name, string.Empty)[/align]
[align=left]普通节点的构造函数[/align]
[align=left]publicINodousItem AddItem(string name)[/align]
[align=left]增加数组节点[/align]
[align=left]publicINodousNode AddNode(string name)[/align]
[align=left]增加普通节点[/align]
[align=left]publicINodousLeaf AddLeaf(string name, string value)[/align]
[align=left]增加叶子节点[/align]
[align=left]publicINodousLeaf SafeAddLeaf(string name, string value)[/align]
[align=left]增加安全叶子节点[/align]
数组节点:XmlNodousItem
[align=left]继承于XmlNodousComponent和INodousItem[/align]
[align=left] [/align]
[align=left]protectedinternal XmlNodousItem(string name) : base(name, string.Empty)[/align]
[align=left]构造函数[/align]
[align=left]publicINodousNode AddItemNode()[/align]
[align=left]添加数组节点[/align]
非常简单的一个类,就只有一个构造函数和一个和一个添加数组节点的方法
叶子节点:XmlNodousLeaf
[align=left]继承于XmlNodousComponent和INodousLeaf[/align]
[align=left] [/align]
[align=left]protectedinternal XmlNodousLeaf(string name, string value) : base(name, value)[/align]
[align=left]构造函数[/align]
[align=left]protectedinternal XmlNodousLeaf(string name, string value, bool isSafe)[/align]
[align=left]构造函数,加了一个参数isSafe,如果为True的话,将把值写处属性[/align]
[align=left]protectedoverridevoid CreateNode()[/align]
[align=left]叶子节点的创建节点和其它节点不一样,所以我们要重写父类的方法[/align]
  注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: