组合模式(Composite)
组合模式将一组对象组织(Compose)成树形结构,以表示一种”部分-整体”的层次结构。
组合模式让客户端可以统一单个对象和组合对象的处理逻辑。
优点:
缺点:
/**
* 抽象类
*/
public abstract class FileSystemNode {
protected String name;
public FileSystemNode(String name) {
this.name = name;
}
// 文件总数
public abstract int count();
}
/**
* 文件
*/
public class FileNode extends FileSystemNode {
public FileNode(String name) {
super(name);
}
@Override
public int count() {
return 1;
}
}
/**
* 文件夹
*/
public class DirectoryNode extends FileSystemNode {
// Node 列表集合
private List<FileSystemNode> subNodes = new ArrayList<>();
public DirectoryNode(String name) {
super(name);
}
@Override
public int count() {
// 遍历统计文件数量
int numOfFiles = 0;
for (FileSystemNode fileOrDir : subNodes) {
numOfFiles += fileOrDir.count();
}
return numOfFiles;
}
public void addSubNode(FileSystemNode node) {
subNodes.add(node);
}
public void removeSubNode(FileSystemNode node) {
subNodes.remove(node);
}
public void clear() {
subNodes.clear();
}
}
测试代码
public class CompositeTest {
@Test
public void test() {
DirectoryNode d1 = new DirectoryNode("目录1");
DirectoryNode d2 = new DirectoryNode("目录2");
DirectoryNode d3 = new DirectoryNode("目录3");
FileNode fileA = new FileNode("文件A");
FileNode fileB = new FileNode("文件B");
FileNode fileC = new FileNode("文件C");
d1.addSubNode(d2);
d1.addSubNode(fileA);
d2.addSubNode(d3);
d3.addSubNode(fileB);
d3.addSubNode(fileC);
Assertions.assertEquals(3,d1.count());
d3.removeSubNode(fileC);
Assertions.assertEquals(2,d1.count());
d2.clear();
Assertions.assertEquals(1,d1.count());
d1.addSubNode(fileC);
Assertions.assertEquals(2,d1.count());
}
}
以上代码与文章会同步到 github 仓库:
/chenbihao/Design-Patterns