一、核心作用:
------将对象组合成树形结构以表示部分-整体的层次结构
------组合模式使用户可以使用一致的方法处理单个对象和组合对象
二、常见应用场景:
1、操作系统的资源管理器
2、XML文件解析
3、Junit单元测试框架
三、组合模式角色分类:
- 组合部件(Component):他是抽象结构,相当于根,定义了叶子和合成部件的共同点
- 叶子(Leaf):在组合中,表示节点对象,无子节点
- 合成部件、容器(Composite):有容器特征,可以包含子节点,表示自己还有孩子
四、代码示例:
一、组合部件:
package com.hezeu.composite;
import java.util.ArrayList;
import java.util.List;
/**
* @Classname AbstractFile
* @Description TODO
* @Date 2020/2/23 下午 12:02
* @Created by 朱进博 1724282894@qq.com
*/
public interface AbstractFile {
void killVirus();
}
二、合成(容器)部件:
class Folder implements AbstractFile{
private String name;
private List<AbstractFile> list = new ArrayList<>();
public Folder(String name) {
super();
this.name = name;
}
public void add(AbstractFile file){
list.add(file);
}
public void remove(AbstractFile file){
list.remove(file);
}
public AbstractFile getChild(int index){
return list.get(index);
}
@Override
public void killVirus() {
System.out.println("---文件夹:"+name+",进行查杀");
for(AbstractFile file : list){
file.killVirus();
}
}
}
三、叶子部件:
class VideoFile implements AbstractFile{
private String name;
public VideoFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("---视频文件:"+name+",进行查杀");
}
}
四、测试:
package com.hezeu.composite;
/**
* @Classname Client
* @Description TODO
* @Date 2020/2/23 下午 12:21
* @Created by 朱进博 1724282894@qq.com
*/
public class Client {
public static void main(String[] args) {
AbstractFile f2,f3,f4,f5;
Folder f1 = new Folder("我的收藏");
f2 = new ImageFile("头像.jpg");
f3 = new TextFile("Hello.txt");
f4 = new VideoFile("视频.mp4");
f5 = new VideoFile("视频2.avi");
f1.add(f2);
f1.add(f5);
f1.killVirus();
}
}
结果如下:
五、组合模式的优缺点:
优点:
无需关心处理的是单个对象还是处理的组合的容器对象,实现容器之间的解耦,当有新部件时,易添加
缺点:
客户端需要花更多时间理清类之间的层次关系
感谢阅读,水平有限,如有错漏,还请不吝赐教