10-组合模式
1.使用组合模式实现一个文件系统
- 文件系统服务端。
public abstract class FileSystemNode {
protected String path;
public FileSystemNode(String path) {
this.path = path;
}
public abstract int countNumOfFiles();
public abstract long countSizeOfFiles();
public String getPath() {
return path;
}
}
public class File extends FileSystemNode {
public File(String path) {
super(path);
}
@Override
public int countNumOfFiles() {
return 1;
}
@Override
public long countSizeOfFiles() {
java.io.File file = new java.io.File(path);
if (file.exists()) {
return file.length();
}
return 0;
}
}
public class Directory extends FileSystemNode {
private List<FileSystemNode> childNode = new ArrayList<>();
public Directory(String path) {
super(path);
}
@Override
public int countNumOfFiles() {
int numOfFiles = 0;
for (FileSystemNode fileSystemNode : childNode) {
numOfFiles += fileSystemNode.countNumOfFiles();
}
return numOfFiles;
}
@Override
public long countSizeOfFiles() {
int sizeOfSize = 0;
for (FileSystemNode fileSystemNode : childNode) {
sizeOfSize += fileSystemNode.countSizeOfFiles();
}
return sizeOfSize;
}
public void addChildNode(FileSystemNode fileOrDirectory) {
childNode.add(fileOrDirectory);
}
public void removeChildNode(FileSystemNode fileSystemNode) {
for (int i = 0;i < childNode.size();i++) {
FileSystemNode node = childNode.get(i);
if (node.getPath().equalsIgnoreCase(fileSystemNode.getPath())) {
childNode.remove(i);
break;
}
}
}
}
- 文件系统客户端构建目录树。
public static void main(String[] args) {
/**
* /
* /home/a.txt
* /home/b.txt
* /opt
*/
Directory fileSystemTree = new Directory("/");
Directory homeNode = new Directory("/home/");
Directory optNode = new Directory("/opt");
fileSystemTree.addChildNode(homeNode);
fileSystemTree.addChildNode(optNode);
File node_home_a = new File("/home/a.txt");
File node_home_b = new File("/home/b.txt");
homeNode.addChildNode(node_home_a);
homeNode.addChildNode(node_home_b);
System.out.println("/ files num: " + fileSystemTree.countNumOfFiles());
}
2.组合模式总结
- 组合模式是一种特殊的设计模式,只有在数据为树状时才能使用,所有在开发中使用的不是很多。
- <<设计模式:可复用面向对象软件的基础>>中对组合模式的描述:将一组对象组织成树形结构,以表示一种"部分-整体"的层次结构。组合模式让客户端可以统一单个对象和组合对象的处理逻辑。
- 组合模式的应用:目录树,表示目录和文件的树形结构;人力树,表示部门和人员的树状结构。