将对象组合成树形结构以表示“部分-整体”的层次结构。 组合模式使得用户对单个对象和组合对象的使用具有唯一性。
简单来讲,比如一个树形结构,有的对象是非叶子节点对象,有的对象是叶子节点对象,如何统一处理这种不同对象的呢,就采用组合模式,先构建一个统一的公共抽象类,然后两者分别继承实现。
为什么这样做呢?这样做就把一个复杂分散的对象关系,变成统一的简单的对象关系来处理,逻辑结构清晰可见。
Component : 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。
abstract class Component { protected String name; public Component(String name) { this.name = name; } public abstract void Add(Component c); public abstract void Remove(Component c); public abstract void Display(int depth); }
Leaf : 表示叶节点对象。叶子节点没有子节点。
class Leaf extends Component { public Leaf(String name) { super(name); } @Override public void Add(Component c) { System.out.println("Can not add to a leaf"); } @Override public void Remove(Component c) { System.out.println("Can not remove from a leaf"); } @Override public void Display(int depth) { String temp = ""; for (int i = 0; i < depth; i++) temp += '-'; System.out.println(temp + name); } }
Composite : 定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove
class Composite extends Component { private List<Component> children = new ArrayList<Component>(); public Composite(String name) { super(name); } @Override public void Add(Component c) { children.add(c); } @Override public void Remove(Component c) { children.remove(c); } @Override public void Display(int depth) { String temp = ""; for (int i = 0; i < depth; i++) temp += '-'; System.out.println(temp + name); for (Component c : children) { c.Display(depth + 2); } } }
客户端调用
public class CompositePattern { public static void main(String[] args) { Composite root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); Composite compX = new Composite("Composite X"); compX.Add(new Leaf("Leaf XA")); compX.Add(new Leaf("Leaf XB")); root.Add(compX); Composite compXY = new Composite("Composite XY"); compXY.Add(new Leaf("Leaf XYA")); compXY.Add(new Leaf("Leaf XYB")); compX.Add(compXY); root.Display(1); } }
应用场景:
1、想要表示对象的部分-整体层次结构。
2、想要客户端忽略组合对象与单个对象的差异,客户端将统一地使用组合结构中的所有对象。
关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。
文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也 可以是目录。
按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式