定义:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。(联想:文件-文件夹、view-viewGroup)
使用场景:
表示对象的部分-整体层次结构时;
从一个整体中能够独立出部分模块或功能的场景;
代码实现一个文件系统
/**
*表示文件和文件夹的抽象类
*/
public abstract class Dir {
/**
* 声明一个List成员变量存储文件夹下的所有元素
*/
protected List<Dir> dirs = new ArrayList<>();
private String name;//当前文件或文件夹名
public Dir(String name) {
this.name = name;
}
/**
* 添加一个文件或文件夹
*
* @param dir
*/
public abstract void addDir(Dir dir);
/**
* 移除一个文件或文件夹
*
* @param dir
*/
public abstract void rmDir(Dir dir);
/**
* 清空文件夹下所有元素
*/
public abstract void clear();
/**
* 输出文件夹目录结构
*/
public abstract void print();
/**
* 获得文件夹下所有的文件或子文件夹
*
* @return
*/
public abstract List<Dir> getFiles();
public String getName() {
return name;
}
}
/**
* 文件夹
*/
public class Folder extends Dir {
public Folder(String name) {
super(name);
}
@Override
public void addDir(Dir dir) {
dirs.add(dir);
}
@Override
public void rmDir(Dir dir) {
dirs.remove(dir);
}
@Override
public void clear() {
dirs.clear();
}
@Override
public void print() {
Log.e_(getName()+"(");
Iterator<Dir> iter=dirs.iterator();
while (iter.hasNext()){
Dir dir=iter.next();
dir.print();
if (iter.hasNext()){
Log.e_(",");
}
}
Log.e_(")");
}
@Override
public List<Dir> getFiles() {
return dirs;
}
}
/**
* 文件
*/
public class File extends Dir {
public File(String name) {
super(name);
}
@Override
public void addDir(Dir dir) {
throw new UnsupportedOperationException("文件对象不支持该操作");
}
@Override
public void rmDir(Dir dir) {
throw new UnsupportedOperationException("文件对象不支持该操作");
}
@Override
public void clear() {
throw new UnsupportedOperationException("文件对象不支持该操作");
}
@Override
public void print() {
Log.e_(getName());
}
@Override
public List<Dir> getFiles() {
throw new UnsupportedOperationException("文件对象不支持该操作");
}
}
public class Client {
public static void main(String[] args) {
//构建一个目录对象表示C盘根目录
Dir diskC = new Folder("C");
//C盘根目录下有一个文件ImbaMallLog.txt
diskC.addDir(new File("ImbaMallLog.txt"));
//C盘根目录下有3个子目录Windows、PerfLogs、Program File
Dir dirWin = new Folder("Windows");
dirWin.addDir(new File("explorer.exe"));
diskC.addDir(dirWin);
Dir dirPer = new Folder("PerfLogs");
dirPer.addDir(new Folder("null.txt"));
diskC.addDir(dirPer);
Dir dirPro = new Folder("Program File");
dirPro.addDir(new File("ftp.txt"));
diskC.addDir(dirPro);
diskC.print();
}
}
//打印结果:C(ImbaMallLog.txt,Windows(explorer.exe),PerfLogs(null.txt()),Program File(ftp.txt))
网友评论