比如设计一个文件系统,linux 上把文件和文件夹都看成文件,那就有一个抽象的文件
abstract class AbstractFile {
protected String name;
AbstractFile(String name) {
this.name = name;
}
}
文件夹里面有一个 HashMap,这里因为可能包含文件或者文件夹,所以使用了抽象类
class Directory extends AbstractFile {
Map<String, AbstractFile> children;
public Directory(String name) {
super(name);
this.children = new HashMap<>();
}
}
文件里有 content
class File extends AbstractFile {
String content;
public File(String name) {
super(name);
this.content = "";
}
}
那比如 ls 操作,因为对于文件和文件夹有不同的处理方式,判断是文件夹后还需要向下转型
for (int i = 1; i < path.length; i++) {
child = curFolder.children.get(path[i]);
if (child instanceof Directory) {
curFolder = (Directory) child;
}
}
感觉使用 instanceof 和向下转型不是特别好,但是面对 OOD 总是抑制不住地想多弄几个继承...
如果不用继承,只有一个 File 类,里面加一个 isFile 变量,判断的部分还是会存在,会是一个更好的方案吗?
1
ccpp132 2020-01-07 01:42:44 +08:00 via Android
isfile 可以是一个接口,不影响你继承
或者这种场景用 visitor pattern 也行。 |