|
在現(xiàn)實生活中,存在很多“部分-整體”的關系,例如,大學中的部門與學院、總公司中的部門與分公司、學習用品中的書與書包、生活用品中的衣月艮與衣柜以及廚房中的鍋碗瓢盆等。 定義與特點組合(Composite)模式的定義:有時又叫作部分-整體模式,它是一種將對象組合成樹狀的層次結構的模式,用來表示“部分-整體”的關系,使用戶對單個對象和組合對象具有一致的訪問性。 組合模式的主要優(yōu)點有:
其主要缺點是:
結構與實現(xiàn)模式的結構組合模式包含以下主要角色:
組合模式分為透明式的組合模式和安全式的組合模式。
模式的實現(xiàn)假如要訪問集合 c0={leaf1,{leaf2,leaf3}} 中的元素,其對應的樹狀圖如圖所示: 下面給出透明式的組合模式的實現(xiàn)代碼,安全式的組合模式與之類似: class Program
{
static void Main(string[] args)
{
IComponent c0=new Composite();
IComponent c1=new Composite();
IComponent leaf1=new Leaf("1");
IComponent leaf2=new Leaf("2");
IComponent leaf3=new Leaf("3");
c0.Add(leaf1);
c0.Add(c1);
c1.Add(leaf2);
c1.Add(leaf3);
c0.Operation();
Console.Read();
}
}
//抽象構件
public interface IComponent
{
void Add(IComponent c);
void Remove(IComponent c);
IComponent GetChild(int i);
void Operation();
}
//樹葉構件
public class Leaf : IComponent
{
private String name;
public Leaf(String name)
{
this.name=name;
}
public void Add(IComponent c){ }
public void Remove(IComponent c){ }
public IComponent GetChild(int i)
{
return null;
}
public void Operation()
{
Console.WriteLine("樹葉"+name+":被訪問!");
}
}
//樹枝構件
public class Composite : IComponent
{
private List<IComponent> children=new List<IComponent>();
public void Add(IComponent c)
{
children.Add(c);
}
public void Remove(IComponent c)
{
children.Remove(c);
}
public IComponent GetChild(int i)
{
return children[i];
}
public void Operation()
{
foreach (var obj in children)
{
obj.Operation();
}
}
}程序運行結果如下: 樹葉1:被訪問! 樹葉2:被訪問! 樹葉3:被訪問! 應用場景前面分析了組合模式的結構與特點,下面分析它適用的以下應用場景:
擴展:樹葉節(jié)點和樹枝節(jié)點進行抽象如果對前面介紹的組合模式中的樹葉節(jié)點和樹枝節(jié)點進行抽象,也就是說樹葉節(jié)點和樹枝節(jié)點還有子節(jié)點,這時組合模式就擴展成復雜的組合模式了,如 Java AWT/Swing 中的簡單組件 JTextComponent 有子類 JTextField、JTextArea,容器組件 Container 也有子類 Window、Panel。復雜的組合模式的結構圖如圖所示:
|
|
|