定义
- 使容器和内容具有一致性。
使用场景
- 在容器中可以放入小容器,也可以放入内容。
– 这句话比较抽象,我们举一个例子,比如我们电脑中的文件目录系统,一个文件夹中既可以放入文件夹(容器)也可以放入文件(内容)。这就形成了一种递归结构。
– 比如中国的省、市、县的地域划分,国家下有省份,也有直辖市,一个省内有市,也有直辖县,市内有县城。
UML图
角色
树叶(leaf):表示内容的角色,由File 类充当。
复合类(composite):表示容器的角色,由Directory 类充当。
组件类(component):使容器和内容具有一致性的角色,由Entry 类充当。
代码实现
//抽象父类
public abstract class Entry {
public abstract String getName();
public abstract int getSize();
public void add(Entry entry) throws Exception {
throw new Exception();
}
}
//叶子类(leaf)
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 this.name;
}
@Override
public int getSize() {
return this.size;
}
}
//composite 类
public class Directory extends Entry {
private String name;
private int size;
private List<Entry> entryList = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public int getSize() {
Iterator iterator = entryList.iterator();
int size = 0;
while (iterator.hasNext()){
size += ((Entry)iterator.next()).getSize();
}
return size;
}
@Override
public void add(Entry entry){
entryList.add(entry);
}
}
//测试
public class Client {
public static void main(String[] args) {
Directory directory = new Directory("dir");
File file1 = new File("file1", 3);
File file2 = new File("file2", 2);
directory.add(file1);
directory.add(file2);
System.out.println(directory.getSize());
}
}
总结
- 内容与容器的一致性。
- 当需要描述有递归结构的类关系时,我们可以使用这种模式。
- 其实就是类与类组合的一种运用。