组合模式(Composite)是一种“结构型”模式(Structural)。结构型模式涉及的对象为两个或两个以上,表示对象之间的活动,与对象的结构有关。
先举一个组合模式的小小例子:
如图:系统中有两种Box:Game Box和Internet Box,客户需要了解者两个类的接口分别进行调用。为了简化客户的工作,创建了XBox类,程序代码如下:
GameBox的代码:
public class GameBox
{
public void PlayGame()
{
Console.WriteLine("plaly game");
}
}
InternetBox的代码:
public class InternetBox
{
public void ConnectToInternet()
{
Console.WriteLine("connect to internet");
}
public void GetMail()
{
Console.WriteLine("check email");
}
}
XBox的代码:
public class XBox
{
private GameBox mGameBox=null;
private InternetBox mInternetBox=null;
public XBox()
{
mGameBox = new GameBox();
mInternetBox = new InternetBox();
}
public void PlayGame()
{
mGameBox.PlayGame();
}
public void ConnectToInternet()
{
mInternetBox.ConnectToInternet();
}
public void GetMail()
{
mInternetBox.GetMail();
}
}
XBox中封装了GameBox和InternetBox的方法,这样,用户面对的情况就大大的简化了,调用的代码如下:
public class CSComposite
{
static void Main (string[] args)
{
XBox x = new XBox();
Console.WriteLine("PlayGame!");
x.PlayGame();
Console.WriteLine();
Console.WriteLine("Internet Play Game!");
x.ConnectToInternet();
x.PlayGame();
Console.WriteLine();
Console.WriteLine("E-Mail!");
x.GetMail();
}
}
可以看见,用户只需要了解XBox的接口就可以了。
组合模式的应用例子
组合模式适用于下面这样的情况:两个或者多个类有相似的形式,或者共同代表某个完整的概念,外界的用户也希望他们合而为一,就可以把这几个类“组合”起来,成为一个新的类,用户只需要调用这个新的类就可以了。
下面举一个例子说明Composite模式的一个实际应用。下面的Class视图:
Employee类是AbstractEmployee接口的一个实现,Boss类是Employee的一个子类,EmpNode是从树视图的TreeNode类继承而来的。我们先看看代码:
AbstractEmployee,这是一个接口,提供下列方法:
public interface AbstractEmployee {
float getSalary(); //get current salary
string getName(); //get name
bool isLeaf(); //true if leaf
void add(string nm, float salary); //add subordinate
void add(AbstractEmployee emp); //add subordinate
IEnumerator getSubordinates(); //get subordinates
AbstractEmployee getChild(); //get child
float getSalaries(); //get salaries of all
}
Employee类是AbstractEmployee接口的一个实现
public class Employee :AbstractEmployee {
protected float salary;
protected string name;
protected ArrayList subordinates;
//------
public Employee(string nm, float salry) {
subordinates = new ArrayList();
name = nm;
salar