三、设计模式
22、组合模式(Composite Pattern)
22.1 定义
组合模式也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系,将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
22.2 角色
- Component(抽象构件角色):定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。
- Leaf(叶子构件):Leaf叶子构件叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。
- Composite(树枝构件):树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。组合模式的重点就在树枝构件。
22.3 结构图
22.4 代码实现
抽象文件
public interface AbstractFile {
void operiation();
}
具体实现
public class ImageFile implements AbstractFile {
private String name;
public ImageFile(String name) {
super();
this.name = name;
}
[@Override](https://my.oschina.net/u/1162528)
public void operiation() {
System.out.println("图片文件:"+name+"处理操作");
}
}
public class TextFile implements AbstractFile {
private String name;
public TextFile(String name) {
super();
this.name = name;
}
[@Override](https://my.oschina.net/u/1162528)
public void operiation() {
System.out.println("文本文件:"+name+"处理操作");
}
}
public class VideoFile implements AbstractFile {
private String name;
public VideoFile(String name) {
super();
this.name = name;
}
[@Override](https://my.oschina.net/u/1162528)
public void operiation() {
System.out.println("视频文件:"+name+"处理操作");
}
}
文件夹
public 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 abstractFile) {
list.add(abstractFile);
}
public void remove(AbstractFile abstractFile) {
list.remove(abstractFile);
}
public AbstractFile getChild(int index) {
return list.get(index);
}
[@Override](https://my.oschina.net/u/1162528)
public void operiation() {
System.out.println("处理"+name +"文件");
for(AbstractFile file:list) {
file.operiation();
}
}
}
测试类
class Test {
@org.junit.jupiter.api.Test
void test() {
AbstractFile textFile,imageFile,videoFile;
textFile = new TextFile("aaa.txt");
imageFile = new ImageFile("bbb.png");
videoFile = new VideoFile("ccc.mp4");
Folder folder = new Folder("D://");
folder.add(textFile);
folder.add(imageFile);
folder.add(videoFile);
Folder folder2 = new Folder("C:");
folder2.add(videoFile);
folder2.add(imageFile);
folder2.add(textFile);
folder2.add(folder);
folder2.operiation();
}
}
控制台
22.5 优点
- 高层模块调用简单。局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
- 节点自由增加。使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点十分简单,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。
22.6 缺点
- 组合模式有一个非常明显的缺点,在上面的场景类可以看到树枝树叶直接使用了实现类,这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,它限制了你接口的影响范围