>>返回《C#常用設(shè)計(jì)模式》
1. 簡(jiǎn)介
- 定義
- 組合多個(gè)對(duì)象形成樹(shù)形結(jié)構(gòu)以表示具有部分-整體關(guān)系的層次結(jié)構(gòu)。
- 組合模式讓調(diào)用程序可以統(tǒng)一對(duì)待單個(gè)對(duì)象和組合對(duì)象
- 案例
- 例如文件系統(tǒng)的文件夾和文件結(jié)構(gòu)就是此模式
- winform中,空間的基類(lèi)是Control類(lèi)型,子類(lèi)有的是單一類(lèi)型(Textbox),有的是容器類(lèi)型(Panel),Add和Remove方法使用暴露Collections的方式,都有方法(eachChild)
2. 示例
namespace WindowsFormsApplication1
{
//抽象的部件類(lèi)描述將來(lái)所有部件共有的行為
public abstract class Component
{
protected string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
//添加部件
public abstract void Add(Component component);
//刪除部件
public abstract void Remove(Component component);
//遍歷所有子部件
public abstract void eachChild();
}
//組合部件類(lèi)
public class Leaf : Component
{
//葉子節(jié)點(diǎn)不具備添加的能力,所以不實(shí)現(xiàn)
public override void Add(Component component)
{
throw new NotImplementedException();
}
//葉子節(jié)點(diǎn)不具備添加的能力必然也不能刪除
public override void Remove(Component component)
{
throw new NotImplementedException();
}
//葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)所以顯示自己的執(zhí)行結(jié)果
public override void eachChild()
{
Console.WriteLine("{0}執(zhí)行了..", name);
}
}
//組合類(lèi)
public class Composite : Component
{
//用來(lái)保存組合的部件
List<Component> myList = new List<Component>();
//添加節(jié)點(diǎn) 添加部件
public override void Add(Component component)
{
myList.Add(component);
}
//刪除節(jié)點(diǎn) 刪除部件
public override void Remove(Component component)
{
myList.Remove(component);
}
//遍歷子節(jié)點(diǎn)
public override void eachChild()
{
Console.WriteLine("{0}執(zhí)行了..", name);
foreach (Component c in myList)
{
c.eachChild();
}
}
}
class Client
{
static void Main(string[] args)
{
//構(gòu)造根節(jié)點(diǎn)
Composite rootComponent = new Composite();
rootComponent.Name = "根節(jié)點(diǎn)";
//添加兩個(gè)葉子幾點(diǎn),也就是子部件
Leaf l = new Leaf();
l.Name = "葉子節(jié)點(diǎn)一";
Leaf l1 = new Leaf();
l1.Name = "葉子節(jié)點(diǎn)二";
rootComponent.Add(l);
rootComponent.Add(l1);
//遍歷組合部件
rootComponent.eachChild();
}
}
}
3. 適用環(huán)境
- 在具有整體和部分層次的結(jié)構(gòu)中,希望通過(guò)一種方式忽略整體與部分的差異,一致的對(duì)待它們
- 在一個(gè)使用面向?qū)ο笳Z(yǔ)言開(kāi)發(fā)的系統(tǒng)中要處理一個(gè)樹(shù)形結(jié)構(gòu)時(shí)
- 在一個(gè)系統(tǒng)總能夠分離出葉子和容器對(duì)象,而且它們的類(lèi)型不固定,需要增加一些新的類(lèi)型
|