版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010647035/article/details/85227137
1、概述
组合模式(Composite Pattern),又叫部分整体模式,是把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
2、组合模式结构
3、代码实现
3.1、普通实现
/**
* 文件对象
*
* @author kaifeng
* @date 2018/12/23
*/
public class File {
private String name;
public File(String name) {
this.name = name;
}
public void list() {
System.out.println(CompositeDemo.compositeBuilder + name);
}
}
/**
* 目录对象
*
* @author kaifeng
* @date 2018/12/23
*/
public class Directory {
private String name;
private ArrayList includedFiles = new ArrayList();
public Directory(String name) {
this.name = name;
}
public void add(Object obj) {
includedFiles.add(obj);
}
public void list() {
System.out.println(CompositeDemo.compositeBuilder + name);
CompositeDemo.compositeBuilder.append(" ");
for (Object obj : includedFiles) {
String name = obj.getClass().getSimpleName();
if (name.equals("Directory")) {
((Directory)obj).list();
} else {
((File)obj).list();
}
}
CompositeDemo.compositeBuilder.setLength(CompositeDemo.compositeBuilder.length() - 3);
}
}
/**
* 普通实现方式
*
* @author kaifeng
* @date 2018/12/23
*/
public class CompositeGeneralDemo {
public static StringBuilder compositeBuilder = new StringBuilder();
public static void main(String[] args) {
Directory d1 = new Directory("一级目录(01)");
Directory d2 = new Directory("二级目录(02)");
Directory d3 = new Directory("三级目录(03)");
File track1 = new File("File_01_01");
File track2 = new File("File_01_02");
File track3 = new File("File_02_01");
File track4 = new File("File_02_02");
File track5 = new File("File_03_01");
d1.add(track1);
d1.add(d2);
d1.add(track2);
d2.add(track3);
d2.add(track4);
d2.add(d3);
d3.add(track5);
d1.list();
}
}
输出结果:
一级目录(01)
File_01_01
二级目录(02)
File_02_01
File_02_02
三级目录(03)
File_03_01
File_01_02
3.2、组合模式实现
/**
* 抽象文件接口
*
* @author kaifeng
* @date 2018/12/23
*/
interface AbstractFile {
void list();
}
/**
* 目录对象实现类
*
* @author kaifeng
* @date 2018/12/23
*/
public class CmpDirectory implements AbstractFile {
private String name;
private ArrayList includedFiles = new ArrayList();
public CmpDirectory(String name) {
this.name = name;
}
public void add(Object obj) {
includedFiles.add(obj);
}
@Override
public void list() {
System.out.println(CompositeDemo.compositeBuilder + name);
CompositeDemo.compositeBuilder.append(" ");
for (Object includedFile : includedFiles) {
AbstractFile obj = (AbstractFile) includedFile;
obj.list();
}
CompositeDemo.compositeBuilder.setLength(CompositeDemo.compositeBuilder.length() - 3);
}
}
/**
* 文件对象实现类
*
* @author kaifeng
* @date 2018/12/23
*/
public class CmpFile implements AbstractFile {
private String name;
public CmpFile(String name) {
this.name = name;
}
@Override
public void list() {
System.out.println(CompositeDemo.compositeBuilder + name);
}
}
/**
* 组合模式客户端调用
*
* @author kaifeng
* @date 2018/12/23
*/
public class CompositeDemo {
public static StringBuilder compositeBuilder = new StringBuilder();
public static void main(String[] args) {
CmpDirectory d1 = new CmpDirectory("一级目录(01)");
CmpDirectory d2 = new CmpDirectory("二级目录(02)");
CmpDirectory d3 = new CmpDirectory("三级目录(03)");
CmpFile track1 = new CmpFile("File_01_01");
CmpFile track2 = new CmpFile("File_01_02");
CmpFile track3 = new CmpFile("File_02_01");
CmpFile track4 = new CmpFile("File_02_02");
CmpFile track5 = new CmpFile("File_03_01");
d1.add(track1);
d1.add(d2);
d1.add(track2);
d2.add(track3);
d2.add(track4);
d2.add(d3);
d3.add(track5);
d1.list();
}
}
4、组合模式应用场景
这种组合模式正是为树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多级目录呈现等树形结构数据的操作。
5、组合模式优缺点
优点:
1、高层模块调用简单。
2、节点自由增加。
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。