定义
将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。–GoF《设计模式》
UML
角色
- Component: 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
- Leaf: 在组合中表示叶子结点对象,叶子结点没有子结点。
- Composite: 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
适用性
以下情况下适用组合模式:
- 你想表示对象的部分-整体层次结构
- 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
示例
/**
* desc : 组合接口
* Created by tiantian on 2018/10/16
*/
public interface Component {
void display();
void add(Component component);
void remove(Component component);
}
/**
* desc : 具有支节点的具体组合类
* Created by tiantian on 2018/10/16
*/
public class Composite implements Component{
private List<Component> subComposite = new ArrayList<>();
@Override
public void display() {
System.out.println("I'm Composite, i have sub Composite");
}
@Override
public void add(Component component) {
subComposite.add(component);
}
@Override
public void remove(Component component) {
subComposite.remove(component);
}
}
/**
* desc : 无支节点的叶子组合类
* Created by tiantian on 2018/10/16
*/
public class Leaf implements Component{
@Override
public void display() {
System.out.println("I'm Leaf,i have no Composite");
}
@Override
public void add(Component component) {
// nothing to do
}
@Override
public void remove(Component component) {
// nothing to do
}
}
public class Client {
public static void main(String[] args) {
Component father = new Composite();
father.add(new Composite());
father.display();
Component leaf = new Leaf();
leaf.display();
father.add(leaf);
}
// output:
// I'm Composite, i have sub Composite
// I'm Leaf,i have no Composite
}
例子中的father可以有很多子节点(孩子),同时子节点又可以有若干子节点,以此类推