简介:
组合模式的意图是 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
可用来处理一类具有“容器特征”的对象,即它们在充当对象的同时,又可以作为容器包含其他多个对象。例如文件夹。
介绍:

优点 |
1.客户端代码可以一致地处理对象和对象容器,无需区别是单个还是组合对象。 2.客户代码与对象容器解耦。 3.安全式的组合模式易于扩展组合对象。 |
缺点 | 1.其叶子和树枝的声明都是实现类,而不是接口,违反了“依赖倒置原则”。 |
特点 |
1.组合对象可以组合,类似递归。 2.简单对象和复合对象必须实现相同的接口 |
抽象构件角色(Component) |
对象的公共接口。在安全式的组合模式中,抽象构件不包含管理组合对象的接口,而是构件提供。 |
树叶构件角色(Leaf) | 下面没有子对象,可以理解为无子节点。 |
树枝构件角色(Composite) |
包含所有下级子对象的对象 |
使用:
本案例的意思是对线和多边形的添加、删除、画操作。
1.透明式
//Component
public abstract class Shape
{
public abstract void Add(Shape shape);
public abstract void Remove(Shape shape);
public abstract void Draw();
}
//Leaf
public sealed class Line : Shape
{
public override void Add(Shape shape)
{
throw new Exception("error");
}
public override void Remove(Shape shape)
{
throw new Exception("error");
}
public override void Draw()
{
//do something
}
}
//Composite
public sealed class Polygon : Shape
{
public override void Add(Shape shape)
{
//do something
}
public override void Remove(Shape shape)
{
//do something
}
public override void Draw()
{
//do something
}
}
//组合模式调用 - 透明
Shape shapeL = new Line();
shapeL.Add(new Polygon()); //error
shapeL.Remove(new Polygon()); //error
shapeL.Draw();
Shape shapeP = new Polygon();
shapeP.Add(new Polygon());
shapeP.Remove(new Polygon());
shapeP.Draw();
2.安全式
//Component
public abstract class Shape
{
public abstract void Draw();
}
//Leaf
public sealed class Line : Shape
{
public override void Draw()
{
//do something
}
}
//Composite
public abstract class IPolygon : Shape
{
public abstract void Add(Shape shape);
public abstract void Remove(Shape shape);
public override void Draw()
{
//do something
}
}
public sealed class Polygon : IPolygon
{
public override void Add(Shape shape)
{
//do something
}
public override void Remove(Shape shape)
{
//do something
}
public override void Draw()
{
//do something
}
}
//组合模式调用 - 安全
Shape shapeL = new Line();
shapeL.Draw();
Shape shapeP = new Polygon();
shapeP.Draw();
((Polygon)shapeP).Add(new Polygon());
((Polygon)shapeP).Remove(new Polygon());