编程-设计模式 8:组合模式

设计模式 8:组合模式

定义与目的
  • 定义:组合模式又称为部分-整体模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  • 目的:该模式的主要目的是将多个对象组织成树形结构以表示“部分-整体”的层次结构,并且能够一致地处理单个对象和组合对象。
实现示例

假设我们需要构建一个文件系统,其中包含文件夹和文件。我们可以使用组合模式来实现这个需求。

// 抽象组件 - 文件系统节点
abstract class FileSystemNode {
    protected String name;

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

    public abstract void add(FileSystemNode node);
    public abstract void remove(FileSystemNode node);
    public abstract void display(int depth);
}

// 叶子组件 - 文件
class File extends FileSystemNode {
    public File(String name) {
        super(name);
    }

    @Override
    public void add(FileSystemNode node) {
        throw new UnsupportedOperationException("Cannot add to a file.");
    }

    @Override
    public void remove(FileSystemNode node) {
        throw new UnsupportedOperationException("Cannot remove from a file.");
    }

    @Override
    public void display(int depth) {
        printDepth(depth);
        System.out.println("File: " + name);
    }

    private void printDepth(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  ");
        }
    }
}

// 复合组件 - 文件夹
class Directory extends FileSystemNode {
    private List<FileSystemNode> children = new ArrayList<>();

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

    @Override
    public void add(FileSystemNode node) {
        children.add(node);
    }

    @Override
    public void remove(FileSystemNode node) {
        children.remove(node);
    }

    @Override
    public void display(int depth) {
        printDepth(depth);
        System.out.println("Directory: " + name);
        for (FileSystemNode child : children) {
            child.display(depth + 1);
        }
    }

    private void printDepth(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  ");
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Directory root = new Directory("root");
        Directory documents = new Directory("documents");
        Directory pictures = new Directory("pictures");

        File report = new File("report.txt");
        File photo = new File("photo.jpg");

        documents.add(report);
        pictures.add(photo);

        root.add(documents);
        root.add(pictures);

        root.display(0);
    }
}
使用场景
  • 当你需要表示对象的分层结构时。
  • 当你想保持一致的接口,无论是处理单个对象还是处理对象组时。
  • 当你需要动态地在组合中添加和移除对象时。

组合模式通过将对象组织成树形结构,使得你可以使用相同的接口来操作单个对象或对象的组合。这对于需要管理复杂的层次结构的对象非常有用。

小结

组合模式是一种常用的结构型模式,它可以帮助你构建复杂的树形结构,并且让你能够以一致的方式处理单个对象和对象的集合。这对于需要表示具有层级关系的对象是非常有用的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值