背景
组合模式,又称为 Composite 模式,在计算机的文件系统中,一个文件夹可以放入文件和文件夹(子文件夹),而子文件夹又可以放入新的文件和文件夹。可以说,文件夹是形成了一种容器结构,递归结构。而 Composite 就是创建出这种结构的模式,能够使容器与内容具有一致性,创造出递归结构的模式就是 Composite模式。
登场角色
Leaf 树叶
表示内容的角色,该角色不能放入其他对象
Composite 复合物
表示容器的角色,可以放入 Leaf 角色和 Composite 角色
Component
使Leaf 角色和Composite 角色具有一致性的角色,相当于实例代码中的Entry
Client
使用Composite模式的角色
类图
示例代码
实例模拟文件夹和文件的存储系统
Entry 类
该类是 File 类和 Directory 类的父类
public abstract class Entry {
public abstract String getName();
public abstract int getSize();
public void printList() {
printList("");
}
public Entry add(Entry entry) {
throw new FileTreatMentException();
}
public abstract void printList(String prefix);
@Override
public String toString() {
return getName() + "(" + getSize() + ")";
}
}
File 类
public class File extends Entry{
private String name;
private int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
return size;
}
@Override
public void printList(String prefix) {
System.out.println(prefix + "/" + this);
}
}
Directory 类
public class Directory extends Entry{
private String name;
private ArrayList<Entry> entries = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public Entry add(Entry entry) {
entries.add(entry);
return this;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
int size = 0;
Iterator<Entry> iterator = entries.iterator();
while (iterator.hasNext()) {
Entry entry = iterator.next();
size += entry.getSize();
}
return size;
}
@Override
public void printList(String prefix) {
System.out.println(prefix + "/" + this);
Iterator<Entry> iterator = entries.iterator();
while (iterator.hasNext()) {
Entry entry = iterator.next();
entry.printList(prefix + "/" + name);
}
}
}
FileTreatMentException类
自定义异常类
public class FileTreatMentException extends RuntimeException{
public FileTreatMentException() {
}
public FileTreatMentException(String message) {
super(message);
}
}
功能分析
- 使用Composite 模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当作一个对象处理;