Java组合模式
模式介绍
组合模式是一种树形结构的设计模式,它将对象组合成树形结构以表示部分整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式有两种类型的对象:叶子节点和组合节点。叶子节点代表组合的最终对象,而组合节点代表包含叶子节点或其他组合节点的对象。
优点
- 对象的层次结构清晰
- 可以统一处理组合对象和叶子对象
- 增加节点或者叶子非常容易
- 简化了客户端代码
缺点
- 简单操作变得复杂
- 要求对组合对象和叶子节点进行区分处理
- 不容易限制组合对象中的组件类型
代码示例
实现一个文件系统
FileSystem组成了树形的结构,File作为叶子节点,Directory作为组合节点
abstract class FileSystem {
protected String name;
public FileSystem(String name) {
this.name = name;
}
public abstract void add(FileSystem fileSystem);
public abstract void remove(FileSystem fileSystem);
public abstract void display();
}
class File extends FileSystem {
public File(String name) {
super(name);
}
@Override
public void add(FileSystem fileSystem) {
System.out.println("不支持添加操作");
}
@Override
public void remove(FileSystem fileSystem) {
System.out.println("不支持删除操作");
}
@Override
public void display() {
System.out.println(name);
}
}
class Directory extends FileSystem {
private List<FileSystem> fileSystemList = new ArrayList<>();
public Directory(String name) {
super(name);
}
@Override
public void add(FileSystem fileSystem) {
fileSystemList.add(fileSystem);
}
@Override
public void remove(FileSystem fileSystem) {
fileSystemList.remove(fileSystem);
}
@Override
public void display() {
System.out.println(name);
for (FileSystem fileSystem : fileSystemList) {
fileSystem.display();
}
}
}
调用
public class Main {
public static void main(String[] args) {
Directory directory1 = new Directory("目录1");
Directory directory2 = new Directory("目录2");
Directory directory3 = new Directory("目录3");
Directory directory4 = new Directory("目录4");
File file1 = new File("文件1");
File file2 = new File("文件2");
File file3 = new File("文件3");
File file4 = new File("文件4");
File file5 = new File("文件5");
File file6 = new File("文件6");
directory1.add(directory2);
directory1.add(directory3);
directory2.add(file1);
directory2.add(file2);
directory2.add(directory4);
directory3.add(file3);
directory4.add(file4);
directory4.add(file5);
directory4.add(file6);
directory1.display();
}
}
输出结果
目录1
目录2
文件1
文件2
目录4
文件4
文件5
文件6
目录3
文件3
总结
组合模式用于处理具有树形结构的对象,使得它们都可以按照统一的方式进行操作。组合模式使得客户端代码的复杂度得以降低。同时,组合模式也存在一些缺点,比如要求区分组合对象和叶子对象,处理操作相对于简单对象变得更加复杂。