天天看小說

第37章

大B:“經(jīng)常使用Control,你會發(fā)現(xiàn)Control有Controls的屬性,而Controls集合包含的還是一個Control,類似的還有XmlNode。他們都有一個共有的特性,數(shù)據(jù)結構都是樹行結構。”

小A:“什麼是樹形模式呢?”

大B:“樹(Tree)是n(n≥0)個結點的有限集T,T爲空時稱爲空樹,否則它滿足如下兩個條件:1、有且僅有一個特定的稱爲根(Root)的結點;2、其餘的結點可分爲m(m≥0)個互不相交的子集Tl,T2……,Tm,其中每個子集本身又是一棵樹,並稱其爲根的子樹(SubTree)。”

大B:“上面給出的遞歸定義刻畫了樹的固有特性:一棵非空樹是由若干棵子樹構成的,而子樹又可由若干棵更小的子樹構成。而這裡的子樹可以是葉子也可以是分支。先看下一幅圖,裡面的套娃就是一個套著一個的。”圖5-2套娃這樣一堆娃娃,一個大的套一個小的,小的裡面還可以套更小的,所以其組織結構爲:

TopToy

Toy

——toy

——toy

——toy

大B:“如果用程序來描述套娃,用設計模式的組合模式(Composite)是一個不錯的主意。組合模式在GOF中定義爲:組合(Composite)模式將對象以樹形結構組織起來,以達成‘部分-整體’的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性。”

大B:“可以說,組合模式是比較簡單易學的設計模式,我按照其定義和規(guī)則,實現(xiàn)一個論壇主題,帖子的組合關係。論壇中,一個主題可以包括很多帖子,一個帖子還可以包括很多回復。”

關係是:

Thread

——Thread||Message

——Thread||Message

下面是實現(xiàn)文件:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceCompositeStudy

{

publicinterfaceIThread

{

voidAdd(IThreadthread);

voidRemove(IThreadthread);

voidRenderContent();

}

}

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceCompositeStudy

{

publicabstractclassAbstractThread:IThread

{

boolisTop;

publicboolIsTop

{

get

{

returnisTop;

}

set

{

isTop=value;

}

}

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

publicList《IThread》Children

{

get

{

returnlist;

}

set

{

list=value;

}

}

stringcontent=;

publicstringContent

{

get

{

returncontent;

}

set

{

content=value;

}

}

publicvoidAdd(IThreadthread)

{

list.Add(thread);

}

publicvoidRemove(IThreadthread)

{

list.Remove(thread);

}

publicabstractvoidRenderContent();

}

}

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceCompositeStudy

{

publicclassThread:AbstractThread

{

publicoverridevoidRenderContent()

{

//輸出自己的。

Console.WriteLine(Thread:+this.Content);

foreach(IThreadtinChildren)

{

t.RenderContent();

}

}

}

}

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceCompositeStudy

{

publicclassMessage:AbstractThread

{

publicoverridevoidRenderContent()

{

Console.WriteLine(Message:+this.Content);

foreach(IThreadtinChildren)

{

t.RenderContent();

}

}

}

}

工廠類爲:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data;

namespaceCompositeStudy

{

/**////《summary》

///工廠類

///《/summary》

wωω◆тTk án◆C○

///《remarks》工廠類《/remarks》

publicclassThreadFactory

{

DataTabletable=newDataTable();

publicThreadFactory()

{

table.Columns.Add(“content”);

table.Columns.Add(“IsTop”);

table.Columns.Add(“IsMessage”);

table.Columns.Add(“ID”);

table.Columns.Add(“ParentID”);

DataRowrow=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);

}

publicList《IThread》GetTopThreads()

{

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

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

foreach(DataRowrowinrows)

{

Threadt=newThread();

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

t.IsTop=true;

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

foreach(DataRowrincs)

{

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

{

Messagem=newMessage();

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

m.IsTop=false;

t.Add(m);

}

else

{

Threadtt=newThread();

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

tt.IsTop=false;

t.Add(tt);

}

}

list.Add(t);

}

returnlist;

}

}

}

客戶端調用方法爲:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceCompositeStudy

{

classProgram

{

staticvoidMain(string[]args)

{

ThreadFactoryfactory=newThreadFactory();

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

foreach(IThreadtinthreads)

{

t.RenderContent();

}

Console.Read();

}

}

}

第179章第171章第127章第227章第220章第156章第151章第37章第159章第194章第114章第196章第102章第220章第76章第46章第212章第71章第218章第33章第200章第58章第93章第142章第28章第153章第162章第163章第13章第82章第7章第194章第158章第16章第57章第160章第48章第44章第36章第121章第31章第143章第115章第129章第102章第4章第64章第110章第20章第85章第199章第7章第51章第228章第60章第117章第215章第123章第228章第5章第217章第206章第126章第149章第169章第36章第221章第28章第216章第178章第176章第81章第44章第79章第215章第209章第47章第53章第117章第110章第169章第16章第43章第119章第59章第176章第37章第21章第116章第195章第90章第189章第180章第83章第95章第23章第157章第97章第113章第114章
第179章第171章第127章第227章第220章第156章第151章第37章第159章第194章第114章第196章第102章第220章第76章第46章第212章第71章第218章第33章第200章第58章第93章第142章第28章第153章第162章第163章第13章第82章第7章第194章第158章第16章第57章第160章第48章第44章第36章第121章第31章第143章第115章第129章第102章第4章第64章第110章第20章第85章第199章第7章第51章第228章第60章第117章第215章第123章第228章第5章第217章第206章第126章第149章第169章第36章第221章第28章第216章第178章第176章第81章第44章第79章第215章第209章第47章第53章第117章第110章第169章第16章第43章第119章第59章第176章第37章第21章第116章第195章第90章第189章第180章第83章第95章第23章第157章第97章第113章第114章
主站蜘蛛池模板: 长岭县| 盐山县| 华池县| 辛集市| 临沂市| 顺义区| 土默特右旗| 五家渠市| 上饶县| 云霄县| 侯马市| 新巴尔虎左旗| 平乐县| 威远县| 清水县| 阿合奇县| 额敏县| 合作市| 龙州县| 汶川县| 望江县| 玉田县| 梅州市| 天津市| 诏安县| 孟津县| 海林市| 澄江县| 永康市| 古浪县| 左云县| 南川市| 邓州市| 涿州市| 合肥市| 商城县| 商南县| 苏尼特右旗| 贵州省| 保定市| 巨野县|