组合模式
原理:又叫做部分-整体模式,将对象组合成树形结构以表示“部分整体”的层次结构
例如:文件系统由目录和文件组成,目录可以装内容,内容可以是目录或者文件,按照这样看的话我们的文件系统就是以递归的结构来组织的。如果想使用这种数据结构那么我们就可以使用组合模式
结构:
Component:是组合中对象的声明接口,实现所有类共有接口的默认行为 声明一个接口用于访问和管理Component
Leaf:在组合中表示叶子结点对象,叶子结点没有子结点
Composite:定义有枝结点行为,用来存储子部件,在Component接口中实现与子部件有关操作:如增加删除
代码示例
复制文件的时候我们是复制这个文件夹下面的所有东西,现在我们需要列出分别有什么目录,这个时候我们需要用到递归,也就是我们可以使用组合模式来实现
Component
//根结点
public interface Node {
public void copy();
}
Leaf
//叶子结点:也就是这个文件下面已经没有任何文件了
public class File implements Node{
String fileName;
public File(String fileName) {
// TODO Auto-generated constructor stub
this.fileName = fileName;
}
@Override
public void copy() {
// TODO Auto-generated method stub
System.out.println(" "+fileName);
}
}
Composite
import java.awt.List;
import java.util.ArrayList;
//Composite 有枝结点
public class Folder implements Node{
private String folderName;
private ArrayList<Node> lists = new ArrayList<Node>();
public Folder(String folderName) {
// TODO Auto-generated constructor stub
this.folderName = folderName;
}
public void add(Node node){
lists.add(node);
}
@Override
public void copy() {
// TODO Auto-generated method stub
System.out.println(" "+folderName);
for(int i=0;i<lists.size();i++){
Node node = lists.get(i);
node.copy();
}
}
}
测试
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Folder folder = new Folder("学习资料");
Folder folser1 = new Folder("视频");
Folder folser2= new Folder("学习视频");
Folder folser3 = new Folder("娱乐视频");
Folder folser4 = new Folder("音乐");
File file = new File("视频1");
File file1 = new File("视频2");
File file2= new File("视频3");
File file3 = new File("音乐1");
File file4 = new File("音乐2");
folder.add(folser1);
folder.add(folser4);
folser1.add(folser2);
folser1.add(folser3);
folser2.add(file);
folser2.add(file1);
folser3.add(file2);
folser4.add(file3);
folser4.add(file4);
folder.copy();
}
}
运行结果
学习资料
视频
学习视频
视频1
视频2
娱乐视频
视频3
音乐
音乐1
音乐2
结构图
总结
1.叶子对象和组合对象实现相同的接口。这就是组合模式能将叶子结点和对象结点进行一致处理的原因
2.可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次