意图
将对象组合成树形结构以表示“部分-整体”的层级结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
结构
其中:
- Component为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问和管理Component的子组件;(可选)在递归结构中定义一个接口,用户访问一个父组件,并在合适的情况实现它。
- Leaf在组合中表示叶结点对象,叶结点没有子节点留在组合中定义图元对象的行为。
- Composite定义有子组件的那些组件的行为;存储子组件;在Component接口中实现与子组件有关的操作。
- Client通过Component接口操作组和组件的对象。
适用性
- 想表示对象的部分-整体层次结构。
- 希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。
代码示例
组合设计模式允许你将对象组合成树形结构,以表示部分-整体层次结构。组合模式使得处理复杂对象层次结构变得更加容易。
// 抽象组件接口
interface Component {
void operation();
}
// 叶子组件
class Leaf implements Component {
@Override
public void operation() {
// 叶子组件的具体操作
}
}
// 复合组件
class Composite implements Component {
private List<Component> children = new ArrayList<>();
public void add(Component component) {
children.add(component);
}
@Override
public void operation() {
// 复合组件的具体操作
for (Component child : children) {
child.operation();
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建一个复合组件
Composite root = new Composite();
// 向复合组件添加叶子组件
root.add(new Leaf());
root.add(new Leaf());
// 创建另一个复合组件
Composite branch = new Composite();
// 向分支复合组件添加叶子组件
branch.add(new Leaf());
branch.add(new Leaf());
// 将分支复合组件添加到根复合组件
root.add(branch);
// 对根复合组件执行操作
root.operation();
}
}
代码设计注释:
- Component 接口定义了所有组件(叶子和复合)的公共操作。
- Leaf 类实现了叶子组件,它执行具体的叶子操作。
- Composite 类实现了复合组件,它可以包含其他组件并执行复合操作。
- Client 类是客户端代码,它创建组件层次结构并对根复合组件执行操作。
组合模式的优点:
- 可扩展性:组合模式允许你动态地构建和修改复杂对象层次结构。
- 可重用性:组合模式允许你重用现有的组件来创建新的组件。
- 灵活性:组合模式允许你根据需要添加或删除组件,而无需修改现有代码。
组合模式的缺点:
- 复杂性:对于大型和复杂的对象层次结构,组合模式可能变得难以管理。
- 性能:对复合组件执行操作可能比对叶子组件执行操作需要更多的处理时间。