1.组合模式概念
允许你将对象组合成树形结构以表示“部分-整体”的层次结构。该模式使得客户端对单个对象和组合对象的使用具有一致性。
2.组合模式组成
1)定义组件接口
创建一个公共接口或抽象类来定义所有组件(叶子和容器)共有的操作。
2)实现叶子组件
实现具体叶子节点,这些节点不含有子节点。
3)实现容器组件
实现包含子节点的容器,可以添加或移除子节点。
4)客户端代码
通过组件接口与对象树中的各个节点交互,无需关心其是否为叶子或容器。
3.举个栗子:
例如电脑中的文件夹(容器组件)和文件(叶子组件),就是通过容器和叶子元素组合起来。
4.代码实现
1)Component接口
package org.xiji.composite;
/**
* 公共类
*/
public interface Component {
/**
* 增加
*/
void add(Component component);
/**
* 移除
*/
void remove(Component component);
/**
* 获取子元素
*/
Component getChild(int index);
/**
* 操作
*/
void operation();
}
2)Documents 文件实现类
package org.xiji.composite;
/**
* 文件
*/
public class Documents implements Component {
public String name;
@Override
public void add(Component component) {
//文件不能新增
}
@Override
public void remove(Component component) {
//文件不能移除容器
}
@Override
public Component getChild(int index) {
//文件不能获取
return null;
}
/**
* 文件操作
*/
@Override
public void operation() {
System.out.println("文件:" + name);
}
}
3)Folder文件夹实现类
package org.xiji.composite;
import java.util.ArrayList;
import java.util.List;
public class Folder implements Component{
/**
* 定义一个集合,用来存储子组件
*/
List<Component> childrenList = new ArrayList<>();
protected String name;
@Override
public void add(Component component) {
childrenList.add(component);
}
@Override
public void remove(Component component) {
childrenList.remove(component);
}
@Override
public Component getChild(int index) {
return childrenList.get(index);
}
/**
* 文件夹操作
*/
@Override
public void operation() {
System.out.println(name +"操作");
System.out.println("============================");
for (int i = 0; i < childrenList.size(); i++) {
childrenList.get(i).operation();
}
System.out.println("============================");
}
}
4)测试类
package org.xiji.composite;
/**
* 组合模式测试类
*/
public class CompositeMain {
public static void main(String[] args) {
/**
* 创建一个根文件
*/
Folder root = new Folder();
root.name = "root";
//创建视频文件夹
Folder video = new Folder();
video.name = "视频文件夹";
//创建个人文件夹
Folder personal = new Folder();
personal.name = "个人文件夹";
//创建视频文件
Documents videoDocuments = new Documents();
videoDocuments.name = "视频文件";
//创建文本文件
Documents textDocuments = new Documents();
textDocuments.name = "文本文件";
//创建音频文件
Documents audioDocuments = new Documents();
audioDocuments.name = "音频文件";
//创建图片文件
Documents imageDocuments = new Documents();
imageDocuments.name = "图片文件";
//为视频文件夹添加文件
video.add(videoDocuments);
video.add(audioDocuments);
//为个人文件夹添加文件
personal.add(imageDocuments);
personal.add(textDocuments);
//为根节点添加文件
root.add(video);
root.add(personal);
video.add(videoDocuments);
//操作做Component的operation方法
root.operation();
}
}