登陆注册
8183300000037

第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();

}

}

}

同类推荐
  • 组态软件控制技术

    组态软件控制技术

    监控组态软件是完成数据采集与过程控制的专用软件,它以计算机为基本工具,为实施数据采集、过程监控、生产控制提供了基础平台和开发环境。本书从应用角度出发,详细介绍了组态软件应用程序的开发过程。对窗口界面编辑、动画链接、实时和历史趋势、安全机制、I/O设备连接,以及生产应用等内容都做了非常详细的介绍。MCGS是优秀的监控组态软件之一,它功能强大、使用方便,可以非常容易地实现监视、控制、管理的各项功能,并可提供软、硬件的全部接口,方便、快速地进行系统集成,构成不同需求的数据采集与监控系统。本书可作为高等学校计算机应用、自动控制、电子技术、机电技术专业的教材,同时还可作为相关专业工程技术人员的自学用书。
  • 组建家庭局域网与无线网

    组建家庭局域网与无线网

    该书是“快乐驿站”丛书之一,是一本精心为初级家庭电脑用户打造的局域网与无线网组建入门与提高的图书,同时还涉及一些办公网络的组建内容。《组建家庭局域网与无线网》以局域网和无线网的功能、设置以及实际应用为导向,用生动的实例、形象的图解和幽默的语言循序渐进地介绍了局域网和无线网的概念、产品、设计、组建、调试与维护的相关内容。
  • 信息技术教育大全-计算机网络

    信息技术教育大全-计算机网络

    信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络
  • 计算机应用基础案例教程

    计算机应用基础案例教程

    本书是根据教育部对高等院校计算机公共基础课程的基本要求,结合计算机技术的最新发展及高职高专类院校计算机基础课程改革的最新动向编写而成。其主要内容包括计算机基础知识、WindowsXP操作系统、Word2003文字处理软件、Excel2003电子表格软件、PowerPoint2003演示文稿制作软件、计算机网络与安全及常用工具软件的使用。本书将理论知识与项目实践相结合,既对理论有较为系统全面的讲解,又通过案例突出了操作技能的培养。本书内容新颖,体系结构合理,可作为高职高专学校、成人高等学校的计算机公共基础课教材,也可以作为广大计算机爱好者的自学参考书。
  • 研究性学习丛书-电脑知识

    研究性学习丛书-电脑知识

    本书对电脑知识有一个全面详细的介绍,会对读者的电脑知识进行提高。
热门推荐
  • 江湖有点萌

    江湖有点萌

    俗话说,有人的地方就有江湖……师傅都跑了,做徒弟的怎么能不踏上寻师之路?坑蒙拐骗吃喝玩乐无所不作。遇见的帅哥正经不正经都是场缘分。遭遇的事件坑爹不坑爹都是场意外。怎么办?江湖凶险,谁知好坏如何。还是乖乖找师傅吧……
  • 异能四少

    异能四少

    当地球哭泣,当世界放弃,没有了希望,还能做什么?
  • 我的脑内不正常选项

    我的脑内不正常选项

    我叫叶玥,因分手狂饮99瓶小白干穿越了,这是一个女强男弱的修仙世界世界,什么?我有一个背负着苦大仇深,三十年河东,莫欺少女穷的同门小师妹,而一星期前我就亲自登门退婚了?终有一天,她握着夸张的黑剑,打破宗门,踩着一地的强大女修们的身体,来到了叶玥的面前叶玥:别问,问就是爱过
  • 爱情公寓之我与诸葛大力恋爱之旅

    爱情公寓之我与诸葛大力恋爱之旅

    一位高富帅从不相信爱情,而却被爱所伤。却要来一场爱伤之旅…爱情公寓,3601室,诸葛大力与张伟分手后,丢掉工作不说,却接二俩三倒霉事不断发生,想要来一场一人分手之旅,摆脱身上霉运…一场喝醉的闹剧走错房间尴尬相遇,一场简简单单旅途,却让俩个已经不相信爱情冤家再次相遇,之后会发生什么事那…我的诸葛大力野蛮女友!
  • 道者杀人经

    道者杀人经

    佛陀杀人,屠刀放下,立地成佛道者杀人,一经入道,永不回头
  • 想了又想还是你

    想了又想还是你

    他是陆家少爷陆初景纨绔公子哥儿成绩也是差的有些离谱.她是平凡的不能再平凡的程羽馨,小时因一场意外和家人走失了,之后遇到了她的养父母,如今已上了年纪养父已去世,只剩她养母一个人,为了减轻负担,她时不时就出去打工,还不忘用空余时间来学习.“您好同学,请问教务处往哪走?”“新来的?小爷今天心情好就告诉你吧.”“陆初景!你把我作业还我!”“有本事你来拿啊.”“馨馨,我回来了”“宇恒哥!”“你..叫程羽馨?”“是..是的”“她是你的养母?”“你是几岁走失的?”“4岁”亲子鉴定竟然是99.99!她竟是程家12年前走失的大小姐?!“什么?娃娃亲?和谁?”
  • 明末海商集团

    明末海商集团

    开局十几条人马七八条枪。“狗儿。”“干啥?”“我背痒,你帮我挠挠。”“掌柜的,咱们正经点好不?”......“九儿。”“什么事?”“有人骂我。”“骂你啥?”“骂我生儿子没屁眼。”“我觉得吧,你一定招惹别人了。”......唉,人心散了,队伍没法带啊。
  • 顽劣凤后:相君来接驾!

    顽劣凤后:相君来接驾!

    前世她只剩具枯骸,今生幻化为人她成了西瑾国众星捧月的皇子殿下!她炼丹炼药全靠一口锅,你没听错,她苏九卿背着口锅战遍天下炼丹师!打遍天下无敌手!她没灵宠打架?对不起她的灵宠不需要打架,她的灵宠早就化成美男跟着她吃香喝辣她还直接开上后宫养兽成仆!她需要女扮男装,简直美死她了好嘛,撩遍妹子掰弯男人的路还很长呢!可是本以为她苏九卿逍遥日子长久,没想到半路竟然还杀出个男人,他霸道将她拥入怀抱:“你是我看着长大的,羊肥了就要喂狼了!”世人都知道他睚眦必报、毒舌腹黑霸道不饶人甚至小气至极、不分黑白,却不知他的温柔、宠溺、宽容、大方、纵容、都给了一人。他能转眼跟别人说他一毛不拔,转头就为她挥洒一座金银宫阙!
  • 多情骑士

    多情骑士

    如若有机会,我愿意做守护你一生的骑士......不过我不想让你有机会~
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!