组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性,掌握组合模式的重点是要理解清楚“部分-整体”还有单个对象和组合对象的含义。组合模式可以让客户端修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。经典案例:目录结构,网站导航结构等。
实例:文件夹系统
文件的统一接口
public interface File {
/**
* 增加子节点的方法
*/
void add(File file);
/**
* 删除子节点的方法
*/
void remove(File file);
/**
* 使用某个软件打开这个文件(文件打开方式)
*/
void open();
}
文件夹也是一个文件,定义了文件夹的打开方式,和修改子节点的方式
import java.util.ArrayList;
import java.util.List;
public class Floder implements File{
/**
* 文件夹有子节点,定义一个存放子节点的集合(可以是set,list,map,Array等)
*/
private List<File> files = new ArrayList<File>();
public void add(File file) {
System.out.println("添加文件");
files.add(file);
}
public void remove(File file) {
System.out.println("移除文件");
files.remove(file);
}
public void open() {
System.out.println("使用windows资源管理器打开了我这个文件夹");
}
}
一个word文档
public class DocFile implements File {
public void add(File file) {
//word文档无子节点不做处理
}
public void remove(File file) {
//word文档无子节点不做处理
}
public void open() {
System.out.println("使用office2003打开了我这个Word文档");
}
}
一个图片文档
public class ImageFile implements File {
public void add(File file) {
//图片无子节点不做处理
}
public void remove(File file) {
//图片无子节点不做处理
}
public void open() {
System.out.println("使用美图秀秀打开了我这个Image文档");
}
}
调用示例
public class CompositeDemo {
public static void main(String[] args) {
//初始化操作,存在一个文件夹
//文件夹下有一个word文档
File floder = new Floder();
File docFile = new DocFile();
floder.add(docFile);
//业务操作
//打开文件夹
floder.open();
//打开word文档
docFile.open();
//移除word文档,并添加一个图片文档
floder.remove(docFile);
File imageFile = new ImageFile();
floder.add(imageFile);
}
}
Component 为组合中的对象声明接口,在适当情况下实现所有类共有接口的缺省行为