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

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

2009-01-14 10:12 375 查看
生成JSON的类



生成JSON的代码不正细述,因为前面两篇已经做了非常详细的描述,这里的改动主要是继承了标准接口之后的调整,然后就是字段的一些改变,也属于代码演进的一个过程吧,读者可以细心去比较代码的变化。
应用
折腾了这么久,反反复复地重构了几次,多了一大堆的代码,给人的感觉面向对象就是让人多少代码似的,不整点的结果出来好像难以服众,呵呵,让我们来看一个典型的应用。

#代码
public string CreateNodous()
{
INodousRoot root = new XmlNodousRoot("Root");
//INodousRoot root = new JSONNodousRoot("Root");
root.SafeAddLeaf("Capital", "北京");
root.SafeAddLeaf("Name", "中国");
INodousItem province = root.AddItem("Provinces");

//---------------------------------------------
INodousNode itemNode = province.AddItemNode();
itemNode.SafeAddLeaf("Name", "北京");
itemNode.SafeAddLeaf("Capital", "东城区");
//更多代码……
}
这个应用是要产生一个行政区域的结构出来,因为是直接产生数据,所以代码会比较多,实际上我们一段都是从数据库中读取数据,然后循环创建的。
当我们需要生成Xml数据的时候,我们就实例化XmlNodousRoot,当我们要生成JSON数据的时候,我们就成生JSONNodousRoot,没准哪天还有另一种数据格式呢,没关系,只要它是树结构,我们就让它继承这些接口就可以了。
实际上还没有完全摆脱当需要变更我们要改代码的处境,虽然只要改一个地方。当然,我们有办法解决这个问题,那就是反射,如果在项目中应用得多的话,我们还要以结合工厂方法模式来处理。

#代码
public string CreateNodous(string instanceName)
{
instanceName = string.Format("Coins.Momo.Nodous.{0}", instanceName);
INodousRoot root = (INodousRoot)Assembly.Load("Conis.Momo.Nodous")
.CreateInstance(instanceName,
false,
BindingFlags.CreateInstance,
null,
new string[] { "Country" },
System.Globalization.CultureInfo.CurrentCulture,
null
);
//更多代码……
}
这是一个很有意思的应用,我们通过反射来确定需要实例化哪一个类,我们可以把instanceName写入到webConfig中,这样就完全摆脱了这类需求变更的影响。
最后,让我们来看一个可视化的应用实例:



执行的两种代码结果(Demo.aspx)



JSON结合Javascript的应用(ForJSON.aspx)



Xml结合Xslt的应用(ForXml.aspx)
总结
终于把一个系列写完了,这是一个很有意思的旅程,在写这个系列的时候我也学了不小的东西,我们可以看到代码从初级阶段的一步步进化,和所有初学者以一样,我也曾经对设计模式、接口与抽象类、重载与覆盖、多态与继承等等疑惑,但通过这一期的例子,我想这些概念与思想都有很好的应用,我一直认为,在实际的项目中进步才是最大的,程序应该要永远追求完美,只要这样,你才会更进步。
接口有点像地下党接头,你只需要知道“天王盖地虎,宝塔镇河妖”就可以找到对应的人了,而不需要对方具体是张三还是李四,这样做的目的是为了松散耦合,让程序彼此之间减少依赖。
过多的程序依赖会造成致命的影响,在现实中,人、家庭、社会,都是松散耦合的代表,而人、家庭、社会又是组合模式的典型应用。
示例代码
附带的代码是在Visual Studio 2008下生成,但是基于.Net Framework 2.0的项目,在Visual Studio 2005下可能有些不同,请使用Visual Studio 2008打开相应的项目
  注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

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