登陆注册
15296300000037

第37章 6 树

大B:“经常使用Control,你会发现Control有Controls的属性,而Controls集合包含的还是一个Control,类似的还有XmlNode。他们都有一个共有的特性,数据结构都是树行结构。”

小A:“什么是树形模式呢?”

大B:“树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:1、有且仅有一个特定的称为根(Root)的结点;2、其余的结点可分为m(m≥0)个互不相交的子集Tl,T2……,Tm,其中每个子集本身又是一棵树,并称其为根的子树(SubTree)。”

大B:“上面给出的递归定义刻画了树的固有特性:一棵非空树是由若干棵子树构成的,而子树又可由若干棵更小的子树构成。而这里的子树可以是叶子也可以是分支。先看下一幅图,里面的套娃就是一个套着一个的。”图5-2套娃这样一堆娃娃,一个大的套一个小的,小的里面还可以套更小的,所以其组织结构为:

Top Toy

Toy

――toy

――toy

――toy

大B:“如果用程序来描述套娃,用设计模式的组合模式(Composite)是一个不错的主意。组合模式在GOF中定义为:组合(Composite)模式将对象以树形结构组织起来,以达成‘部分-整体’的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。”

大B:“可以说,组合模式是比较简单易学的设计模式,我按照其定义和规则,实现一个论坛主题,帖子的组合关系。论坛中,一个主题可以包括很多帖子,一个帖子还可以包括很多回复。”

关系是:

Thread

――Thread||Message

――Thread||Message

下面是实现文件:

using System;

using System。Collections。Generic;

using System。Text;

namespace CompositeStudy

{

public interface IThread

{

void Add(IThread thread);

void Remove(IThread thread);

void RenderContent();

}

}

using System;

using System。Collections。Generic;

using System。Text;

namespace CompositeStudy

{

public abstract class AbstractThread:IThread

{

boolisTop;

public bool IsTop

{

get

{

returnisTop;

}

set

{

isTop=value;

}

}

List《IThread》list=new List《IThread》();

public List《IThread》Children

{

get

{

return list;

}

set

{

list=value;

}

}

string content=;

public string Content

{

get

{

return content;

}

set

{

content=value;

}

}

public void Add(IThread thread)

{

list。Add(thread);

}

public void Remove(IThread thread)

{

list。Remove(thread);

}

public abstract void RenderContent();

}

}

using System;

using System。Collections。Generic;

using System。Text;

namespace CompositeStudy

{

public class Thread:AbstractThread

{

public override void RenderContent()

{

//输出自己的。

Console。WriteLine(Thread: this。Content);

foreach(IThread t in Children)

{

t。RenderContent();

}

}

}

}

using System;

using System。Collections。Generic;

using System。Text;

namespace CompositeStudy

{

public class Message:AbstractThread

{

public override void RenderContent()

{

Console。WriteLine(Message: this。Content);

foreach(IThread t in Children)

{

t。RenderContent();

}

}

}

}

工厂类为:

using System;

using System。Collections。Generic;

using System。Text;

using System。Data;

namespace CompositeStudy

{

/**////《summary》

///工厂类

///《/summary》

///《remarks》工厂类《/remarks》

public class ThreadFactory

{

DataTable table=new DataTable();

public ThreadFactory()

{

table。Columns。Add(“content”);

table。Columns。Add(“IsTop”);

table。Columns。Add(“IsMessage”);

table。Columns。Add(“ID”);

table。Columns。Add(“ParentID”);

DataRow row=table。NewRow();

row[“content”]=“test”;

row[“IsTop”]=false;

row[“IsMessage”]=false;

row[“ID”]=1;

row[“ParentID”]=0;

table。Rows。Add(row);

row=table。NewRow();

row[“content”]=“test1”;

row[“IsTop”]=true;

row[“IsMessage”]=false;

row[“ID”]=0;

row[“ParentID”]=-1;

table。Rows。Add(row);

row=table。NewRow();

row[“content”]=“test2”;

row[“IsTop”]=false;

row[“IsMessage”]=true;

row[“ID”]=2;

row[“ParentID”]=0;

table。Rows。Add(row);

row=table。NewRow();

row[“content”]=“test3”;

row[“IsTop”]=false;

row[“IsMessage”]=true;

row[“ID”]=3;

row[“ParentID”]=0;

table。Rows。Add(row);

}

public List《IThread》GetTopThreads()

{

List《IThread》list=new List《IThread》();

DataRow[]rows=table。Select(“IsTop=true”);

foreach(DataRow row in rows)

{

Thread t=new Thread();

t。Content=row[“content”]。ToString();

t。IsTop=true;

DataRow[]cs=table。Select(“ParentID=” Convert。ToInt32(row[“ID”]));

foreach(DataRow r in cs)

{

if(Convert。ToBoolean(r[“IsMessage”]))

{

Message m=new Message();

m。Content=r[“content”]。ToString();

m。IsTop=false;

t。Add(m);

}

else

{

Thread tt=new Thread();

tt。Content=r[“content”]。ToString();

tt。IsTop=false;

t。Add(tt);

}

}

list。Add(t);

}

return list;

}

}

}

客户端调用方法为:

using System;

using System。Collections。Generic;

using System。Text;

namespace CompositeStudy

{

class Program

{

static void Main(string[]args)

{

ThreadFactory factory=new ThreadFactory();

List《IThread》threads=factory。GetTopThreads();

foreach(IThread t in threads)

{

t。RenderContent();

}

Console。Read();

}

}

}

同类推荐
  • 我看电商

    我看电商

    本书是作者近30年从事零售及电子商务管理的总结和分享。近年来电商行业在中国迅猛发展,2012年网络零售市场规模达到13,000亿人民币,诞生了淘宝、天猫、京东、当当、凡客、唯品会……等一大批全新的网络公司,电子商务正在日益深入的影响着越来越多人的生活。如今这位自称跨界老兵的电商操盘手第一次全方位剖析电商风云,细说中美电子商务发展的不同路径,评点国内各大电商企业的是是非非,详解其中的融资、模式、运营、效率……个中经验,毫无保留的娓娓道来,笔触至深,让人不禁掩卷沉思。
  • 成为淘宝创业的超级毕业生

    成为淘宝创业的超级毕业生

    本书讲述如何通过淘宝创业将大学在校生打造成为“超级毕业生”。主要内容包括大学生从事淘宝创业的理论基础、学以致用的操作指南,以及可资借鉴的案例。书中的理念篇可供对创业教育感兴趣的高校教师参考;实战篇提出的“淘宝十二招”,操作简单,易学易用;案例篇讲述了十位成功在校创业大学生的故事,主要供学生参考。读完本书,相信凡是关注大学教育者或希望通过淘宝创业的大学生,皆能从中获得启发,对创业从无心变有心,从有心变行动,亲身投入或参与到这个伟大的事业中来。
  • 图说电子计算机

    图说电子计算机

    今天人们谈到计算机常常会把它和网络联系起来。20世纪90年代兴起的因特网其影响之广、普及之快也是大家始料未及的,也从没有一种技术能像网络一样日新月异,并迅速地改变着我们的学习和生活方式。因特网大大缩小了时空界限,为我们提供了快捷方便的交流途径。在未来10年内,计算机又将会有怎样飞速的发展呢?在互联网上进行医疗诊断、远程教学、电子商务、视频会议等活动已经实现,未来的互联网的传输速率将会提高100倍,大家可以随时随地连接到因特网上,更方便地进行交流、沟通和开展商务活动。
  • 公开时刻

    公开时刻

    本书从传播者分析,内容分析,媒介分析受众与效果分析,传播环境与传播控制分析等几大方面把汶川地震作为重大传播案例,阐释汶川地震的传播学遗产。对政府部门和新闻媒体在危机公关方面做出正面评价。
  • 如何建设网站

    如何建设网站

    本书以问答的方式介绍了建设网站的基本知识,内容包括:网站设计的八个步骤、建设网站需要掌握的工具软件、网页中插入图像、在网页中隐藏内容等。
热门推荐
  • 技术法师

    技术法师

    当地球上的科学家重生到丰富多彩的异世界,带着满身的科技,聪慧的头脑,在这充满神秘色彩的魔法世界里,又会发生怎样的故事呢?
  • 漫漫夜空发亮的星

    漫漫夜空发亮的星

    命运可以掌控未来,而命运掌握在我们的手中。到底是谁掌握了谁,我们拭目以待!
  • 毒爱邪皇殿下

    毒爱邪皇殿下

    一场交易,温柔中沉沦,美丽中堕落,“棋子就该做好棋子的事,主人要你走,你就不能停,要你死,你就不能生,明白么?我的小月儿!”他指尖轻轻滑破她脸颊,温和的笑一如即往,却让人跌入冰底般寒心,恶魔的微笑亦不过如此!“那死呢?”她嘴角微勾,如罂粟绽放。“你可以试试!”轻轻俯首。她说过:他要做善人,她陪你上天堂,他要做恶魔,她陪他下地狱……恶魔,一旦爱上,就象毒药,戒不掉!野兽,一旦惹上,就象蔓藤,逃不开!情极端得让人无法逃离!爱强烈得让人无法呼吸!荆棘之路,最缠绵的毒,他们是相互的归宿?还是彼此的坟墓?到底谁伤了谁?
  • 穿越小郡主:萌夫当头

    穿越小郡主:萌夫当头

    以为穿越成一个架空时代的郡主是多么好的福气,却不料成为皇兄江山社稷的牺牲品。莫名其妙的给她添了五个未婚夫也就算了,怎么各个都是惹不起的奇葩?一个是冷血无情闻风丧胆的扑克脸一个是男是女傻傻分不清楚的人妖一个是桃花烂到爆的人缘超好娘炮一个是大大咧咧乳臭未干的傻小子一个是花心滥情超级自恋的暴发户唔,我还是黄花大闺女,才不要什么未婚夫呢!
  • 宠妻有度:太傅爱养成

    宠妻有度:太傅爱养成

    不管是穿越还是重生,这一次,柳风雅只想好好的过日子。今生有疼爱她的父母,宠爱她的哥哥就已经足矣。只是不知道为什么自从小的时候第一次相遇起,柳风雅就被一个不知道脸皮为何物的男人缠上了,还被打压的苦不堪言,偏偏她还反抗不得!老天!你为何给我投了一个好胎,还要诞生一个专治她的妖孽男人啊?!她只想低调安静的过着衣来伸手饭来张口的日子的说!“怎么?夫人对夫君的教导不甚满意,还是说……”某男人看着对他睁着一双黑白分明的大眼,拉着他衣袖可怜兮兮的低着头的小女人。“怎么会呢?是我自己笨,总是学不会才是!”柳风雅闻言,立马像拨浪鼓一样着头,“夫君教导的很好!”
  • 琳琅珏

    琳琅珏

    相传苏家祖先原本居于他地,后因经商路上偶遇两棵巨树,根枝交错的拦住行路,苏家先祖命人砍伐,刀锯不能伤其一丝一毫,并且刀斧砍伐的时候会发出玉石相撞的琳琅声。幸得一游僧,说此乃双生树,双生双死,如果得到护佑,必然会有回报。于是苏家祖先在此立石碣,设香堂,常年有人祈福。苏家祖先后逝的当夜,电闪雷鸣,巨树齐齐被雷劈断,在苏家小姐拜祭时发现树下有一异物,挖出一看,是一通体隐隐流淌着光芒的宝玉。于是带回家中进行加工。宝玉一分为二,一半纯黑如墨,一半晶黄如珀,两块玉合二为一,时常发出琳琅之声于是称之为琳琅珏,也叫双生珏。
  • 今生只等你爱我

    今生只等你爱我

    苏缨络,一个骄傲的女子,为了爱情,和心爱的人离家出走,为了心爱的儿子,回到豪门,为了恨,她毁掉了一个女人
  • 校花穿越之大宋王妃

    校花穿越之大宋王妃

    穿就穿呗,这年头穿越的小说流行得很啊!可是要穿越事先也得通知一声啊!本来是到游泳馆里游泳的,可没有想到,跳出进去,再出来竟穿到了大宋!晕!
  • 麻辣妃子笑

    麻辣妃子笑

    她王府中的嫡女,却过着连丫鬟都不如的日子。她PL集团董事长,年纪轻轻就已经被评为全国十大杰出青年,全国十大青年领袖。她拒绝了那么多优秀才俊的追求,最终竟爱上了归国的教授。她把一切都给了他,她爱的是那么彻底那么无私。可是当一个神秘电话揭开了这个归国教授的神秘身份时,她彻底的崩溃了。(本文纯属虚构,请勿模仿。)
  • 魔境仙歌

    魔境仙歌

    本是混迹黑道的无忧少年,因不堪忍受家庭变故和女友的离去,选择跳楼自杀。这一跳,却穿越到另一个世界:魔域大陆,机缘巧合之下,被修仙高人玉恒子所救,并收为徒弟,从此踏上了修仙之旅,为此也卷入到一场仙魔战争之中。等待他的,不仅是各种新奇的境遇,还有诸多充满未知的危险和挑战……