Fork me on GitHub

组合模式

组合模式也称为部分整体模式,它的作用是将一组相似的对象看作一个对象处理,然后提供同一的方法去访问相应对象,这样可以很容易地得到一个树形结构,操作系统中的文件就可以抽象成一个经典的组合模式,如下:

抽象根节点:抽象文件类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public abstract class Dir {
protected List<Dir> dirs = new ArrayList<>();
private String name;
public Dir(String name) {
this.name = name;
}

public abstract void addDir(Dir dir);
public abstract void removeDir(Dir dir);
public abstract void clear();
public abstract void print();
public abstract List<Dir> getFiles();

public String getName() {
return name;
}
}

具体枝干节点:文件夹类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Folder extends Dir {
public Folder(String name) {
super(name);
}

@Override
public void addDir(Dir dir) {
dirs.add(dir);
}

@Override
public void removeDir(Dir dir) {
dirs.remove(dir);
}

@Override
public void clear() {
dirs.clear();
}

@Override
public void print() {
System.out.print(getName()+"(");
Iterator<Dir> iterator = dirs.iterator();
while (iterator.hasNext()) {
Dir dir = iterator.next();
dir.print();
if (iterator.hasNext()) {
System.out.print(",");
}
}
System.out.print(")");

}

@Override
public List<Dir> getFiles() {
return dirs;
}
}

具体叶子节点:文件类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class File extends Dir {
public File(String name) {
super(name);
}

@Override
public void addDir(Dir dir) {
throw new UnsupportedOperationException("文件对象不支持该操作");
}

@Override
public void removeDir(Dir dir) {
throw new UnsupportedOperationException("文件对象不支持该操作");
}

@Override
public void clear() {
throw new UnsupportedOperationException("文件对象不支持该操作");
}

@Override
public void print() {
System.out.print(getName());
}

@Override
public List<Dir> getFiles() {
throw new UnsupportedOperationException("文件对象不支持该操作");
}
}

具体使用如下:

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
Dir diskC = new Folder("C");
diskC.addDir(new File("test.txt"));
Dir dirWin = new Folder("Windows");
dirWin.addDir(new File("explorer.exe"));
diskC.addDir(dirWin);
diskC.print();
}
}

结果

1.PNG

组合文件十分适合数据对象之间存在着递归关系的情景