组合模式(Composite Pattern)

本文介绍了一种树形结构的设计模式——组合模式,详细解释了其结构组成、优缺点及应用场景,并通过一个具体的文件夹管理实例展示了如何实现组合模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述
组合模式是一种树形结构,每个节点可以看作一个对象,在一个对象中又包含其他对象,这些被包含的对象可能是终点对象(叶子结点),也有可能是非终点对象(也叫组对象或者非叶子结点)。
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
在组合模式结构图中包含如下几个角色:
  • Component(抽象构件):它可以是接口抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。
  • Leaf(叶子构件):它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。
  • Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
2、优缺点
优点: 1、高层模块调用简单。 2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
3、场景
场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
4、实例

public class Noder {
private String name;
public Noder(String name) {
this.name = name;
}
List<Noder> noderList = new ArrayList<Noder>();
public void add(Noder noder) {
noderList.add(noder);
}
public void remove(Noder noder) {
noderList.remove(noder);
}
public List<Noder> getNoderList() {
return noderList;
}
@Override
public String toString() {
return "Noder{" +
"name='" + name + '\'' +
", noderList=" + noderList +
'}';
}
}

public class CompositePatternDemo {
public static void main(String[] args) {
Noder noder = new Noder("顶级文件夹");
Noder noderLeft = new Noder("左文件夹");
Noder noderRight = new Noder("右文件夹");
noder.add(noderLeft);
noder.add(noderRight);

Noder leaf1 = new Noder("叶子节点1");
Noder leaf2 = new Noder("叶子节点2");
noderLeft.add(leaf1);
noderRight.add(leaf2);

List<Noder> noderList = noder.getNoderList();
for(Noder temp: noderList) {
System.out.println(temp.toString());;
}
}
}

增加节点:左文件夹
增加节点:右文件夹
增加节点:叶子节点1
增加节点:叶子节点2
Noder{name='左文件夹', noderList=[Noder{name='叶子节点1', noderList=[]}]}
Noder{name='右文件夹', noderList=[Noder{name='叶子节点2', noderList=[]}]}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值