组合模式主要处理的是客户在使用组合对象时对其结构的依赖。组合对象内部解决自身的复杂结构,使客户代码就像使用简单对象一样使用组合对象。
组合模式又分为安全式的组合模式和透明式的组合模式。安全式的组合模式要求管理聚集的方法只出现在组合对象中,而不出现在简单对象中。透明式的组合模式要求所有的对象,不论组合对象还是简单对象,均符合一个固定的接口。
下例中模拟ASP.NET中的button和panel控件,使用的是安全式的组合模式,类与结构图的对应关系是:
IControl = Component
Button = Leaf
Panel = Composite
图1:安全式的组合模式
图2:透明式的组合模式
public
class
App
{
public
static
void
Main()
{
IControl button1
=
new
Button();
Panel panel1
=
new
Panel();
panel1.Add(button1);
Panel panel2
=
new
Panel();
panel2.Add(panel1);
//
如果没有组合模式,这里就要很繁琐的(遍历每个控件)调用Initialize方法了
panel2.Initialize();
Console.ReadLine();
}
}
public
interface
IControl
{
void
Initialize();
}
public
class
Button : IControl
{
public
void
Initialize()
{
Console.WriteLine(
"
初始化Button控件
"
);
}
}
public
class
Panel : IControl
{
List
<
IControl
>
controlList;
public
Panel()
{
controlList
=
new
List
<
IControl
>
();
}
public
void
Add(IControl control)
{
controlList.Add(control);
}
public
void
Remove(IControl control)
{
if
(controlList
==
null
)
{
throw
new
InvalidOperationException(
"
控件列表为空
"
);
}
controlList.Remove(control);
}
public
void
Initialize()
{
Console.WriteLine(
"
初始化Panel控件
"
);
foreach
(var control
in
controlList)
{
control.Initialize();
}
}
}