设计模式之组合模式

设计模式之组合模式

将对象组合成树结构以表示部分整体层次结构。当使用树结构的上层和下层组件属性可能差别很大,所以说一般情况下需要对这两类对象进行分别处理, 但Composite允许客户端统一处理单个对象和对象组合。也就是说可以将叶子组件与整体进行一致性处理,实现的方法是组件和整体实现相同接口。

应用场景

  1. 想要表示对象的部分与整体之间的层次结构
  2. 想要客户端忽略组合对象和单个对象的区别,使用组合模式会统一处理最后的组合对象。

组合模式结构

经典模式

最典型的情况就是多级树形菜单和文件夹结构。盗个图 - -

组合模式结构

上图,虽然国家,地区,城市属于不同的层级,但是都需要继承同一个接口,是客户端能够统一的调用不同层级的对象。类似多级树形菜单的结构。

代码

第一部分:抽象组件

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
// 这个抽象组件即完成了抽象组件的功能,又完成了“树枝”的功能,能够链接各个叶子节点
public abstract class Component {
String name;
Integer areaLevel;
List<Component> list = new LinkedList<>();

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

public void printName(){
System.out.println("Name : "+name);
};

public void printLevel(){
System.out.println("Area Level :" + areaLevel);
};
// 这里在抽象类的方法中直接打印子组件(ps:应统一递归输出子组件的子组件)
public void printAll(){
for (Component p:list
) {
System.out.println("子组件:"+ p.name);
p.printName();
p.printLevel();
}
}
public void add(Component component){
list.add(component);
};
}

第二部分:树叶构件

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 国家级别树叶节点
public class Country extends Component {
List<Province> provinceList = new LinkedList<>();

public Country(String name, Integer areaLevel) {
super(name, areaLevel);
}

@Override
public void printName() {
System.out.println("Country Name :" + this.name);;
}

public void add(Province province){
provinceList.add(province);
}

public void printAll(){
System.out.println("当前组件:"+name + "等级:"+ areaLevel);
for (Province p:provinceList
) {
p.printAll();
}
}
@Override
public void printLevel() {
System.out.println("Country Level :" + this.areaLevel);
}
}
// 省级别树叶节点
public class Province extends Component{

List<City> cityList = new ArrayList<>();

public Province(String name, Integer areaLevel) {
super(name, areaLevel);
}

@Override
public void printName() {
System.out.println("Province Name :" +this.name);
}

public void add(City city){
cityList.add(city);
}

public void printAll(){
System.out.println("当前组件:"+name + "等级:"+ areaLevel);
for (City p:cityList
) {
p.printAll();
}
}
@Override
public void printLevel() {
System.out.println("");
}
}
// 市级别树叶节点

public class City extends Component {

public City(String name, Integer areaLevel) {
super(name, areaLevel);
}

@Override
public void printName() {
System.out.println("City Name :" + this.name);
}

@Override
public void printLevel() {
System.out.println("City Level " + this.areaLevel);
}

public void printAll(){
System.out.println("组件:"+ this.name);
}
}

第三部分:客户端

1
2
3
4
5
6
7
8
9
10
public class App {
public static void main(String[] args) {
Country zhongguo = new Country("china", 0);
City langfang = new City("langfang", 2);
Province hebei = new Province("hebei", 1);
zhongguo.add(hebei);
hebei.add(langfang);
zhongguo.printAll();
}
}
1
2
3
当前组件:china 等级:0
当前组件:hebei 等级:1
组件:langfang
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之组合模式

文章作者:NanYin

发布时间:2019年06月01日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/01/2019-06-03-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E7%BB%84%E5%90%88%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。