目录
1.Composite模式
1.1 作用
在操作系统中, 虽然文件夹与文件是不同类型的对象, 但它们都可以放入到文件夹中, 因此文件和文件夹有时也被系统称为"目录条目". 在目录条目中, 文件夹和文件被当作是同一种对象看待, 即一致性. 这种文件系统的结构就是一种容器结构,递归结构.
Composite模式就是能够使容器和内容具有一致性, 创造出递归结构的模式.
1.2 示例程序
1.2.1 示例程序类图
1.2.2 Entry抽象类
//文件和文件夹的父类,目录条目抽象类
public abstract class Entry {
public abstract String getName();//名字
public abstract int getSize();//大小
public abstract Entry add(Entry entry);//向文件夹内添加文件
public void printList() {
printList("");
}
public abstract void printList(String prefix);//前缀
@Override
public String toString() {
return getName() + "(" + getSize() + ")";
}
}
1.2.3 File类
//文件类
public class File extends Entry{
private String name;
public 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 Entry add(Entry entry) {//文件没有add功能,实现直接返回null
return null;
}
@Override
public void printList(String prefix) {
System.out.println(prefix + "/" + this);
}
}
1.2.4 Directory类
//文件夹类
//文件中可以有文件,也可以有更小的文件夹
public class Director extends Entry{
private String name;
private List<Entry> directory = new ArrayList<>();
public Director(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {//文件夹的大小要把这个文件夹内的所有内容的大小加起来
int size = 0;
Iterator it = directory.iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
size += entry.getSize();
}
return size;
}
@Override
public Entry add(Entry entry) {
directory.add(entry);
return this;
}
@Override
public void printList(String prefix) {//递归打印出文件夹中每个文件或文件夹
System.out.println(prefix + "/" + this);
Iterator it = directory.iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
entry.printList(prefix + "/" + name);
}
}
}
1.2.5 Main类
public class Main {
public static void main(String[] args) {
System.out.println("Making root entries...");
Director rootdir = new Director("root");
Director bindir = new Director("bin");
Director tmpdir = new Director("tmp");
Director usrdir = new Director("usr");
rootdir.add(bindir);
rootdir.add(tmpdir);
rootdir.add(usrdir);
bindir.add(new File("vi",10000));
bindir.add(new File("latex",20000));
rootdir.printList();
}
}
输出:
1.3 Composite模式中的角色
- Leaf(树叶): 表示内容的角色, 在该角色中不能放入其他对象. 上述的File类.
- Composite(复合物): 表示容器的角色, 可以在其中放入Leaf和Composite角色. 上述的Directory类.
- Component: 使Leaf角色和Composite角色具有一致性的角色, 即Component角色是Leaf角色和Composite角色的父类.
- Client: 使用Composite模式的角色.
- Composite模式的类图:
1.4 其他特点
- 在程序世界中, 到处都存在递归结构和Composite模式.
- 比如视窗系统中, 一个窗口可以含有一个子窗口
- 可以将计算机命令合并为一条宏命令, 这条宏命令又可以作为另一个宏命令的子命令.
根据图解设计模式书籍进行整理.