定义:将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
如图所示:一个Composite实例可以像一个简单的Leaf实例一样,可以把它传递给任何使用Component的方法或者对象,并且它表现的就像是一个Leaf一样。
实例:
// 菜单接口
public interface IMenu {
// 取得名称
public String getName();
// 显示
public void display();
// 添加菜单
public void addItem(IMenu menu);
// 取得所有子菜单
public Iterator getChildren();
}
// 菜单 ,这里相当于一个非叶子节点
public class Menu implements IMenu {
private List<IMenu> items = new ArrayList<IMenu>();
private String name;
public Menu(String name) {
this.name = name;
}
public void addItem(IMenu menu) {
items.add(menu);
}
public void display() {
System.out.println(this.name + ":Menu");
Iterator children = this.getChildren();
while (children.hasNext()) {
IMenu menu = (IMenu) children.next();
menu.display();
}
}
public Iterator getChildren() {
return new ListIterator(items);
}
public String getName() {
return this.name;
}
}
// 菜单项 ,这里相当于叶节点
public class MenuItem implements IMenu {
private String name;
public MenuItem(String name) {
this.name = name;
}
public void display() {
System.out.println(this.name + ":MenuItem");
}
public String getName() {
return this.name;
}
public void addItem(IMenu menu) {
throw new UnsupportedOperationException();
}
public Iterator getChildren() {
return new NullIterator();
}
}
// 菜单条,这里相当于根节点
public class MenuBar {
private List<IMenu> menus = new ArrayList<IMenu>();
public void addMenu(IMenu menu) {
this.menus.add(menu);
}
public void display() {
System.out.println(":MenuBar");
Iterator items = new ListIterator(menus);
while (items.hasNext()) {
IMenu menu = (IMenu) items.next();
menu.display();
}
}
}
// 空迭代器
public class NullIterator implements Iterator {
public boolean hasNext() {
return false;
}
public Object next() {
return null;
}
}