類圖
設計模式--組合模式 源碼
package composite;
public interface IFile {
//下面兩個方法,相當于類圖中operation方法
void delete();
String getName();
/* 以上為公共行為,以下為檔案夾才有的行為 */
//建立新檔案,相當于add方法
void createNewFile(String name);
//相當于remove方法
void deleteFile(String name);
//相當于GetChild方法
IFile getIFile(int index);
}
Folder.java
package composite;
import java.util.ArrayList;
import java.util.List;
public class Folder implements IFile{
private String name;
private IFile folder;
private List<IFile> files;
public Folder(String name) {
this(name, null);
}
public Folder(String name,IFile folder) {
super();
this.name = name;
this.folder = folder;
files = new ArrayList<IFile>();
}
public String getName() {
return name;
}
//與File的删除方法不同,先删除下面的檔案以及檔案夾後再删除自己
public void delete() {
List<IFile> copy = new ArrayList<IFile>(files);
System.out.println("------------删除子檔案-------------");
for (IFile file : copy) {
file.delete();
}
System.out.println("----------删除子檔案結束-------------");
if (folder != null) {
folder.deleteFile(name);
}
System.out.println("---删除[" + name + "]---");
}
public void createNewFile(String name) {
if (name.contains(".")) {
files.add(new File(name,this));
}else {
files.add(new Folder(name,this));
}
}
public void deleteFile(String name) {
for (IFile file : files) {
if (file.getName().equals(name)) {
files.remove(file);
break;
}
}
}
public IFile getIFile(int index) {
return files.get(index);
}
}
File.java
package composite;
public class File implements IFile{
private String name;
private IFile folder;
public File(String name,IFile folder) {
super();
this.name = name;
this.folder = folder;
}
public String getName() {
return name;
}
public void delete() {
folder.deleteFile(name);
System.out.println("---删除[" + name + "]---");
}
//檔案不支援建立新檔案
public void createNewFile(String name) {
throw new UnsupportedOperationException();
}
//檔案不支援删除檔案
public void deleteFile(String name) {
throw new UnsupportedOperationException();
}
//檔案不支援擷取下面的檔案清單
public IFile getIFile(int index) {
throw new UnsupportedOperationException();
}
}
Client.java
package composite;
public class Client {
public static void main(String[] args) {
IFile root = new Folder("我的電腦");
root.createNewFile("C槽");
root.createNewFile("D盤");
root.createNewFile("E盤");
IFile D = root.getIFile(1);
D.createNewFile("project");
D.createNewFile("電影");
IFile project = D.getIFile(0);
project.createNewFile("test1.java");
project.createNewFile("test2.java");
project.createNewFile("test3.java");
IFile movie = D.getIFile(1);
movie.createNewFile("電影1.avi");
movie.createNewFile("電影2.avi");
/* 以上為目前檔案系統的情況,下面我們嘗試删除檔案和檔案夾 */
display(null, root);
System.out.println();
project.delete();
movie.getIFile(1).delete();
System.out.println();
display(null, root);
}
//列印檔案系統
public static void display(String prefix,IFile iFile){
if (prefix == null) {
prefix = "";
}
System.out.println(prefix + iFile.getName());
if(iFile instanceof Folder){
for (int i = 0; ; i++) {
try {
if (iFile.getIFile(i) != null) {
display(prefix + "--", iFile.getIFile(i));
}
} catch (Exception e) {
break;
}
}
}
}
}
測試截圖
設計模式--組合模式