设计模式 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);
}
}
使用场景
- 当你需要表示对象的分层结构时。
- 当你想保持一致的接口,无论是处理单个对象还是处理对象组时。
- 当你需要动态地在组合中添加和移除对象时。
组合模式通过将对象组织成树形结构,使得你可以使用相同的接口来操作单个对象或对象的组合。这对于需要管理复杂的层次结构的对象非常有用。
小结
组合模式是一种常用的结构型模式,它可以帮助你构建复杂的树形结构,并且让你能够以一致的方式处理单个对象和对象的集合。这对于需要表示具有层级关系的对象是非常有用的。