组合模式(Composite)

本文深入探讨了组合模式的概念,一种将对象组织成树形结构的设计模式,以表达部分-整体的关系,使得客户能一致地处理单个对象和复合对象。文章详细介绍了组合模式的结构组成、适用场景及优缺点,并通过文件系统的实例代码展示了如何实现。

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

1、概念

组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性,属于结构性模式。

2、模式结构

  • Component:组合中的对象声明接口,实现所有类共有接口的默认行为,声明一个接口用于访问和管理Component子部件
  • Leaf:叶子对象,叶子结点没有子结点
  • Composite:容器对象,定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作

3、使用场景

  • 表示对象的部分-整体层次结构
  • 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节

4、优缺点

优点:

  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易
  • 客户端调用简单,客户端可以一致的使用组合结构或其中单个对象
  • 更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码

缺点:

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
  • 使设计变得更加抽象

5、实例

public abstract class File {
    private String name;

    public File(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void display();
}
public class Folder extends File {

    private List<File> files;

    public Folder(String name) {
        super(name);
        files = new ArrayList<>();
    }

    @Override
    public void display() {
        for (File file : files) {
            file.display();
        }
    }

    public void add(File file) {
        files.add(file);
    }

    public void remove(File file){
        files.remove(file);
    }
}
public class ImageFile extends File {

    public ImageFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        // image的业务逻辑
    }
}
public class TextFile extends File {

    public TextFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        // text的业务逻辑
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值