应用场景:
通过实现组合模式,调用者对组合对象的操作与对单一对象的操作具有一致性。调用者不用关心这是组合对象还是文件,也不用关心组合对象内部的具体结构,就可以调用相关方法,实现功能。
这里对windows中的文件和文件夹的操作来说明,我们可以看到我们自己对文件和文件夹都有重名名,复制,粘贴,剪切等功能,我们不会去关心它是文件还是文件夹。直接无脑复制粘贴即可。
定义文件或文件夹共有的操作
/**
* 定义树形结构中每个节点共有的操作
* @author Administrator
*
*/
public interface Operation {
//复制
public void copy();
//粘贴
public void paste();
}
------------------------------------------------
/**
* 文件,相当于树形结构中的叶,它的下面没有子节点
* @author Administrator
*
*/
public class File implements Operation{
@Override
public void copy() {
System.out.println("---复制文件"+fileName);
}
@Override
public void paste() {
System.out.println("---粘贴文件"+fileName);
}
private String fileName;
public File(String fileName) {
super();
this.fileName = fileName;
}
}
-----------------------------------------------------------------
/**
* 文件夹,作为组合模式中的树型结构中的根
* @author Administrator
*
*/
public class Folder implements Operation {
private List<Operation> list = new ArrayList<Operation>();
//addOperation以此来建立树形结构
public void addOperation(Operation operation){
list.add(operation);
}
@Override
public void copy() {
System.out.println("---复制文件夹"+folderName);
if(list.size()==0)
return;
//遍历此文件夹下的所有文件或文件夹
for (Operation operation : list) {
operation.copy();
}
}
@Override
public void paste() {
System.out.println("---粘贴文件夹"+folderName);
if(list.size()==0)
return;
//遍历此文件夹下的所有文件或文件夹
for (Operation operation : list) {
operation.paste();
}
}
public String folderName;
public Folder(String folderName) {
super();
this.folderName = folderName;
}
}
----------------------------------------------------------------
/**
* 测试类
* @author Administrator
*
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Folder folderMusic = new Folder("音乐文件夹");
Folder folderMusic_2 = new Folder("张信哲专辑文件夹");
File fileMusic1 = new File("大海.mp3");
File fileMusic2 = new File("新贵妃醉酒.mp3");
File fileMusic3 = new File("没那么简单.mp3");
File fileMusic4 = new File("过火.mp3");
File fileMusic5 = new File("从开始到现在.mp3");
File fileMusic6 = new File("别怕我伤心.mp3");
/**----------------------------------------------**/
//建立树形结构,形成组合模式
folderMusic.addOperation(folderMusic_2);
folderMusic_2.addOperation(fileMusic4);
folderMusic_2.addOperation(fileMusic5);
folderMusic_2.addOperation(fileMusic6);
folderMusic.addOperation(fileMusic1);
folderMusic.addOperation(fileMusic2);
folderMusic.addOperation(fileMusic3);
/**----------------------------------------------**/
//对组合中的对象进行复制和粘贴操作
folderMusic.copy();
System.out.println(">>>>>>>>");
folderMusic.paste();
}
}
Result:
---复制文件夹音乐文件夹
---复制文件夹张信哲专辑文件夹
---复制文件过火.mp3
---复制文件从开始到现在.mp3
---复制文件别怕我伤心.mp3
---复制文件大海.mp3
---复制文件新贵妃醉酒.mp3
---复制文件没那么简单.mp3
>>>>>>>>
---粘贴文件夹音乐文件夹
---粘贴文件夹张信哲专辑文件夹
---粘贴文件过火.mp3
---粘贴文件从开始到现在.mp3
---粘贴文件别怕我伤心.mp3
---粘贴文件大海.mp3
---粘贴文件新贵妃醉酒.mp3
---粘贴文件没那么简单.mp3