1. 设计模式-组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构来表示整体与部分的层次结构。它使得用户对单个对象和组合对象的使用具有一致性,也就是说,组合对象可以被当作一个单独的对象来处理,而不需要知道它是组合还是单个对象。这使得客户端代码可以一致地处理所有的对象,无论是简单的叶节点对象还是复杂的组合对象。
组合模式通过定义一个抽象的组件类(Component),声明一个接口用于访问和管理子组件。这个接口在组合对象和叶子对象中有着不同的实现。组合对象(Composite)维护着子组件的集合,并实现了与子组件相关的操作(如添加、删除、获取子组件等)。叶子对象(Leaf)是组合中的基本对象,没有子组件。
假设我们构建一个文件系统目录结构,其中目录可以包含文件和子目录。
2. 抽象组件(Component)
public abstract class FileSystemComponent {
private String name;
public FileSystemComponent(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void display(int depth);
}
3. 叶子对象(Leaf)
public class File extends FileSystemComponent {
private int size;
public File(String name, int size) {
super(name);
this.size = size;
}
public int getSize() {
return size;
}
@Override
public void display(int depth) {
System.out.println(getIndent(depth) + getName() + " (Size: " + getSize() + ")");
}
private String getIndent(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append(" ");
}
return sb.toString();
}
}
4. 组合对象(Composite)
import java.util.ArrayList;
import java.util.List;
public class Directory extends FileSystemComponent {
private List<FileSystemComponent> components = new ArrayList<>();
public Directory(String name) {
super(name);
}
public void add(FileSystemComponent component) {
components.add(component);
}
public void remove(FileSystemComponent component) {
components.remove(component);
}
public List<FileSystemComponent> getComponents() {
return components;
}
@Override
public void display(int depth) {
System.out.println(getIndent(depth) + getName() + " (Directory)");
for (FileSystemComponent component : components) {
component.display(depth + 1);
}
}
}
5. 使用示例
public class CompositePatternDemo {
public static void main(String[] args) {
Directory rootDir = new Directory("root");
Directory subDir1 = new Directory("subDir1");
File file1 = new File("file1.txt", 100);
File file2 = new File("file2.txt", 200);
subDir1.add(file1);
rootDir.add(subDir1);
rootDir.add(file2);
rootDir.display(0);
}
}
组合模式非常适合处理具有层次结构的数据,如文件系统、组织结构等。它通过提供一个统一的方式来处理单个对象和组合对象,简化了客户端代码,同时也便于扩展和维护。然而,设计时需注意不要过度使用,避免结构过于复杂,影响系统的性能和可维护性。
6. 优点
- 结构清晰:组合模式清晰地定义了层次结构,易于管理对象的树形结构。
- 易扩展:容易添加新的组件类型,客户端可以一致地处理组合和叶子对象。
- 统一接口:客户端可以使用统一的接口来操作组合结构中的所有对象。
7. 缺点
- 设计复杂度增加:需要正确区分组件和叶子对象,以及管理树结构可能引入的复杂性。
- 性能问题:在深度嵌套的组合结构中,递归调用可能会影响性能