组合模式

类图

代码

Component

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
abstract class Component{

private String name;

public Component(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public abstract void display();
}

Leaf

1
2
3
4
5
6
7
8
9
10
11
class File extends Component{

public File(String name) {
super(name);
}

@Override
public void display() {
System.out.println("文件:" + this.getName());
}
}

Composite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Folder extends Component{

private List<Component> list = new ArrayList<Component>();

public Folder(String name) {
super(name);
}

public void add(Component component){
this.list.add(component);
}

@Override
public void display() {
for (Component component : list) {
System.out.println("文件夹:" + this.getName());
component.display();
}
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Main {
public static void main(String args[]){
File file1 = new File("文件1");
File file2 = new File("文件2");
File file3 = new File("文件3");
Folder folder1 = new Folder("文件夹1");
Folder folder2 = new Folder("文件夹2");
Folder folder3 = new Folder("文件夹3");

folder1.add(folder2);
folder1.add(folder3);
folder2.add(file1);
folder2.add(file2);
folder3.add(file3);

folder1.display();
}
}

运行结果

1
2
3
4
5
6
7
8
文件夹:文件夹1
文件夹:文件夹2
文件:文件1
文件夹:文件夹2
文件:文件2
文件夹:文件夹1
文件夹:文件夹3
文件:文件3

总结

概述

组合模式相当于树,表明了一种整体与部分的层次结构,如例子中的系统中的文件和文件夹的体系就是组合模式的一种

优点

清晰的进行层次划分,增加新构件比较容易
对客户端透明,客户端可以进行统一调用
可以忽略整体与部分的差异性,统一处理

缺点

使设计变的更加抽象,对象的业务规则如果很复杂,实现组合模式具有很大的挑战性,不过这也不能明确算是组合模式的一个缺点,大多设计模式都有此特点