文章目录
介绍
能够使容器与内容具有一致性,创造出递归结构的模式
就是 Composite 模式。Composite 在英文中是"混合物""复合物"的意思。
以目录为例,在计算机中,某个目录下有文件、文件夹。文件夹下面还有文件和文件夹。无限下去,因而形成递归。
开始
架构图
定义条目
java
public interface Entry {
/**
* 添加
*
* @param entry
*/
void add(Entry entry);
/**
* 打印整颗树
*
* @param prefix
*/
void printList(String prefix);
/**
* 获取名称
*
* @return
*/
String getName();
/**
* 获取大小
*
* @return
*/
int getSize();
}
定义文件
java
public class File implements Entry {
private final String name;
private final int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
@Override
public void add(Entry entry) {
}
@Override
public void printList(String prefix) {
System.out.println(prefix + "/" + name + " ( " + getSize() + " )");
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
return size;
}
}
定义文件夹
java
public class Directory implements Entry {
private final String name;
private final List<Entry> directoryList = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public void add(Entry entry) {
directoryList.add(entry);
}
@Override
public void printList(String prefix) {
System.out.print(prefix + "/" + name);
System.out.println(" ( " + getSize() + " )");
for (Entry next : directoryList) {
next.printList(prefix + "/" + name);
}
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
int size = 0;
for (Entry next : directoryList) {
size += next.getSize();
}
return size;
}
}
测试样例
java
@Slf4j
@SpringBootTest(classes = CompositeApplication.class)
public class TestComposite {
@Test
public void testTree() {
Entry entry = new Directory("root");
Entry bin = new Directory("bin");
Entry tmp = new Directory("tmp");
Entry usr = new Directory("usr");
entry.add(bin);
entry.add(tmp);
entry.add(usr);
Entry vi = new File("vi", 20);
Entry latex = new File("latex", 30);
bin.add(vi);
bin.add(latex);
entry.printList("");
System.out.println("当前目录 root 一共大小:" + entry.getSize());
System.out.println("当前目录 bin 一共大小:" + bin.getSize());
System.out.println("当前目录 tmp 一共大小:" + tmp.getSize());
System.out.println("当前目录 usr 一共大小:" + usr.getSize());
bin.printList("/root");
}
}
总结
使用 Composite 模式可以使容器与内容具有一致性
,也可以称其为多个和单个的一致性
,即将多个对象结合在一起,当作一个对象进行处理。