4.3 客户端代码
class Program
{
static void Main(string[] args)
{
// 生成树根,并为其增加两个叶子节点
Component root = new Composite("Root");
root.Add(new Leaf("Leaf A in Root"));
root.Add(new Leaf("Leaf B in Root"));
// 为根增加两个枝节点
Component branchX = new Composite("Branch X in Root");
Component branchY = new Composite("Branch Y in Root");
root.Add(branchX);
root.Add(branchY);
// 为BranchX增加页节点
branchX.Add(new Leaf("Leaf A in Branch X"));
// 为BranchX增加枝节点
Component branchZ = new Composite("Branch Z in Branch X");
branchX.Add(branchZ);
// 为BranchY增加叶节点
branchY.Add(new Leaf("Leaf in Branch Y"));
// 为BranchZ增加叶节点
branchZ.Add(new Leaf("Leaf in Branch Z"));
// 显示树
root.Display(1);
Console.Read();
}
}
运行结果
5. 透明方式与安全方式
5.1 透明方式:在Component中声明所有来管理子对象的方法,其中包括Add,Remove等。这样实现Component接口的所有子类都具备了Add和Remove方法。这样做的好处是叶节点和枝节点对于外界没有区别,它们具备完全一致的接口。
5.2 安全方式:在Component中不去声明Add和Remove方法,那么子类的Leaf就不需要实现它,而是在Composit声明所有用来管理子类对象的方法。
5.3 两种方式有缺点:对于透明方式,客户端对叶节点和枝节点是一致的,但叶节点并不具备Add和Remove的功能,因而对它们的实现是没有意义的;对于安全方式,叶节点无需在实现Add与Remove这样的方法,但是对于客户端来说,必须对叶节点和枝节点进行判定,为客户端的使用带来不便。
6. 模式总结
6.1 优点
6.1.1 使客户端调用简单,它可以一致使用组合结构或是其中单个对象,简化了客户端代码。
6.1.2 容易在组合体内增加对象部件。客户端不必因加入了新的部件而更改代码。有利于功能的扩展。











