意图:

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

结构:

Composite

参与者

  • Component(Graphic)
    • 为组合中的对象声明接口。
    • 在适当的情况下,实现所有类共有接口的缺省行为。
    • (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。
  • Leaf(Rectangle、Line、Text等)
    • 在组合中表示叶节点对象,叶节点没有子节点。
    • 在组合中定义图元对象的行为。
  • Composite(Picture)
    • 定义有子部件的那些部件的行为。
    • 存储子部件。
    • 在Component接口中实现与子部件有关的操作。
  • Client
    • 通过Component接口操纵组合部件的对象。

代码示例:

Component

public interface Component {

	public void operation();
	
	public void add(Component item);
	
	void remove(Component item);
	
	public Component getChild(int i);
}

Composite

public class Composite implements Component {
	
	private List<Component> children = new ArrayList<Component>();

	@Override
	public void operation() {
		for (Component child : children) {
			child.operation();
		}
	}

	@Override
	public void add(Component item) {
		this.children.add(item);
	}

	@Override
	public void remove(Component item) {
		this.children.remove(item);
	}

	@Override
	public Component getChild(int i) {
		return this.children.get(i);
	}

}

Leaf

public class Leaf implements Component {

	@Override
	public void operation() {
		//do something
	}

	@Override
	public void add(Component item) {

	}

	@Override
	public void remove(Component item) {

	}

	@Override
	public Component getChild(int i) {
		return null;
	}

}

Client

public class Client {

	public static void main(String[] args) {
		Component composite = new Composite();
		composite.add(new Leaf());
		composite.add(new Composite());
		composite.operation();
	}
}

适应:

  • 你想表示对象的部分-整体层次结构。
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

效果:

  • 定义了包含基本对象和组合对象的类层次结构
  • 简化客户代码
  • 使得更容易增加新类型的组件
  • 使你的设计变得更加一般化

相关模式:

通常部件-父部件连接用于Responsibility of Chain模式。

Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,它们 通常有一个公共的父类。因此装饰必须支持具有Add、Remove和GetChild操作的Component接口。

Flyweight让你共享组件,但不再能引用他们的父部件。

Itertor可用来遍历Composite。

Visitor将本来应该分布在Composite和Leaf类中的操作和行为局部化。