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