在设计当中,通常会遇到一些成树状结构的数据,这些数据如何在JAVA中进行组织,如何对这些数据进行抽象,成了设计师们关心的问题。其中成树状结构的数据,在我们使用的系统中见得最多的,莫过于文件的组织结构了,如何将文件的组织结构进行抽象与设计,将现实中的事物转化成系统中可操作的数据,成为我这次要琢磨的问题。
首先来看文件与目录的共同点进行抽象,可以得到如何抽象类:
public abstract class AbstractDir
{
//目录或文件名称
private String name;
//创建时间
private Date createTime;
//父目录
private AbstractDir parent;
//文件路径
private String path;
public abstract long getSize();
public abstract boolean isFile();
public abstract String getId();
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getCreateTime()
{
return createTime;
}
public void setCreateTime(Date createTime)
{
this.createTime = createTime;
}
public AbstractDir getParent()
{
return parent;
}
public void setParent(AbstractDir parent)
{
this.parent = parent;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
}
-------------------------------------------
之后将文件类与目录类都继承与该类,得到如下类:
public class File extends AbstractDir
{
private String id;
private String md5Code;
private long size;
private boolean isFile;
private Date modifyTime;
private Date accessTime;
public File()
{
Date d = new Date();
this.isFile = true;
this.id = "FL"+d.getTime();
}
public File(String name)
{
Date d = new Date();
this.isFile = true;
this.id = "FL"+d.getTime();
setName(name);
}
public File(String name,String md5Code)
{
Date d = new Date();
this.isFile = true;
this.id = "FL"+d.getTime();
setName(name);
setMd5Code(md5Code);
}
public String getId()
{
return this.id;
}
public boolean isFile()
{
return isFile;
}
public String getMd5Code()
{
return md5Code;
}
public void setMd5Code(String md5Code)
{
this.md5Code = md5Code;
}
public long getSize()
{
return size;
}
public void setSize(long size)
{
this.size = size;
}
public Date getModifyTime()
{
return modifyTime;
}
public void setModifyTime(Date modifyTime)
{
this.modifyTime = modifyTime;
}
public Date getAccessTime()
{
return accessTime;
}
public void setAccessTime(Date accessTime)
{
this.accessTime = accessTime;
}
}
--------------------------------------------
public class Folder extends AbstractDir
{
private String id;
private long size;
private boolean isFile = false;
//所包含的文件或目录
private Map<String, AbstractDir> map = new HashMap<String, AbstractDir>();
private int fileNum;
private int folderNum;
public Folder()
{
Date d = new Date();
this.id = "FD" + d.getTime();
this.setCreateTime(d);
}
public Folder(String name)
{
Date d = new Date();
this.id = "FD" + d.getTime();
this.setCreateTime(d);
setName(name);
}
@Override
public long getSize()
{
return this.size;
}
@Override
public boolean isFile()
{
return isFile;
}
public int getFileNum()
{
return fileNum;
}
public int getFolderNum()
{
return folderNum;
}
@Override
public String getId()
{
return id;
}
public AbstractDir addOrUpdateDir(AbstractDir dir)
{
map.put(dir.getName(), dir);
dir.setParent(this);
long size = dir.getSize();
this.size = this.size + size;
if (dir.isFile())
{
this.fileNum++;
} else
{
Folder f = (Folder) dir;
this.folderNum = this.folderNum + f.getFolderNum() + 1;
this.fileNum=this.fileNum+f.getFileNum();
}
return dir;
}
public AbstractDir removeDir(String name)
{
AbstractDir d = map.remove(name);
d.setParent(null);
long size = d.getSize();
this.size = this.size - size;
if (d.isFile())
{
this.fileNum--;
} else
{
Folder f = (Folder) d;
this.folderNum = this.folderNum - f.getFolderNum() - 1;
this.fileNum=this.fileNum-f.getFileNum();
}
return d;
}
}
我们采用安全的复合模式并且结合文件的特点,实现文件与文件夹之间的双向关联,解决文件结构的抽象问题。
这样做的好处是什么?假设我们要做一个文件存储系统,那么可以将用户存储的文件的目录和文件进行抽象,之后现实成一个类。假设用户存储的文件是以一人一个文件夹为单位,那么将文件夹(A)内部的文件和目录经过抽象实现成一个Folde(A),当用户登录的时候,取得各自的Folde(A),这样一来,用户通过这个类,就可以得到有关文件夹(A)的大量信息。
首先来看文件与目录的共同点进行抽象,可以得到如何抽象类:
public abstract class AbstractDir
{
//目录或文件名称
private String name;
//创建时间
private Date createTime;
//父目录
private AbstractDir parent;
//文件路径
private String path;
public abstract long getSize();
public abstract boolean isFile();
public abstract String getId();
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getCreateTime()
{
return createTime;
}
public void setCreateTime(Date createTime)
{
this.createTime = createTime;
}
public AbstractDir getParent()
{
return parent;
}
public void setParent(AbstractDir parent)
{
this.parent = parent;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
}
-------------------------------------------
之后将文件类与目录类都继承与该类,得到如下类:
public class File extends AbstractDir
{
private String id;
private String md5Code;
private long size;
private boolean isFile;
private Date modifyTime;
private Date accessTime;
public File()
{
Date d = new Date();
this.isFile = true;
this.id = "FL"+d.getTime();
}
public File(String name)
{
Date d = new Date();
this.isFile = true;
this.id = "FL"+d.getTime();
setName(name);
}
public File(String name,String md5Code)
{
Date d = new Date();
this.isFile = true;
this.id = "FL"+d.getTime();
setName(name);
setMd5Code(md5Code);
}
public String getId()
{
return this.id;
}
public boolean isFile()
{
return isFile;
}
public String getMd5Code()
{
return md5Code;
}
public void setMd5Code(String md5Code)
{
this.md5Code = md5Code;
}
public long getSize()
{
return size;
}
public void setSize(long size)
{
this.size = size;
}
public Date getModifyTime()
{
return modifyTime;
}
public void setModifyTime(Date modifyTime)
{
this.modifyTime = modifyTime;
}
public Date getAccessTime()
{
return accessTime;
}
public void setAccessTime(Date accessTime)
{
this.accessTime = accessTime;
}
}
--------------------------------------------
public class Folder extends AbstractDir
{
private String id;
private long size;
private boolean isFile = false;
//所包含的文件或目录
private Map<String, AbstractDir> map = new HashMap<String, AbstractDir>();
private int fileNum;
private int folderNum;
public Folder()
{
Date d = new Date();
this.id = "FD" + d.getTime();
this.setCreateTime(d);
}
public Folder(String name)
{
Date d = new Date();
this.id = "FD" + d.getTime();
this.setCreateTime(d);
setName(name);
}
@Override
public long getSize()
{
return this.size;
}
@Override
public boolean isFile()
{
return isFile;
}
public int getFileNum()
{
return fileNum;
}
public int getFolderNum()
{
return folderNum;
}
@Override
public String getId()
{
return id;
}
public AbstractDir addOrUpdateDir(AbstractDir dir)
{
map.put(dir.getName(), dir);
dir.setParent(this);
long size = dir.getSize();
this.size = this.size + size;
if (dir.isFile())
{
this.fileNum++;
} else
{
Folder f = (Folder) dir;
this.folderNum = this.folderNum + f.getFolderNum() + 1;
this.fileNum=this.fileNum+f.getFileNum();
}
return dir;
}
public AbstractDir removeDir(String name)
{
AbstractDir d = map.remove(name);
d.setParent(null);
long size = d.getSize();
this.size = this.size - size;
if (d.isFile())
{
this.fileNum--;
} else
{
Folder f = (Folder) d;
this.folderNum = this.folderNum - f.getFolderNum() - 1;
this.fileNum=this.fileNum-f.getFileNum();
}
return d;
}
}
我们采用安全的复合模式并且结合文件的特点,实现文件与文件夹之间的双向关联,解决文件结构的抽象问题。
这样做的好处是什么?假设我们要做一个文件存储系统,那么可以将用户存储的文件的目录和文件进行抽象,之后现实成一个类。假设用户存储的文件是以一人一个文件夹为单位,那么将文件夹(A)内部的文件和目录经过抽象实现成一个Folde(A),当用户登录的时候,取得各自的Folde(A),这样一来,用户通过这个类,就可以得到有关文件夹(A)的大量信息。