组合模式

1 概念

1 定义

将对象组合成树形结构以表示“部分——整体”的层次结构

组合模式使客户端对单个对象和组合对象保持一致的处理方式

类型:结构型

2 适用场景

  • 希望客户端可以忽略组合对象和单个对象之前的差异
  • 处理树形结构时

3 优缺点

优点

  • 让客户端忽略了层次的差异,方便对整个层次进行控制。简化客户端代码
  • 符合开闭原则

缺点

  • 使设计变得抽象

2 代码实现

场景:打印课程目录和课程的层次关系。课程的主目录包括课程目录和课程。

有些课程属于某个子目录下,有些无法归类到子目录,直属于主目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 目录组件
* 目录 和 书籍 都继承 CatalogComponent 接口
* 子类根据当前的的类型 , 选择性重写接口
*/
public abstract class CatalogComponent {
public void add(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持添加操作");
}

public String getName(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持获取名称操作");
}

public void print(){
throw new UnsupportedOperationException("不支持打印操作");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Course extends CatalogComponent {
private String name;
private double price;

public Course(String name, double price) {
this.name = name;
this.price = price;
}

@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}

public double getPrice(CatalogComponent catalogComponent) {
return this.price;
}

@Override
public void print() {
System.out.println("Course Name:"+name+" Price:"+price);
}

}
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
public class Catalog extends CatalogComponent {
private List<CatalogComponent> items = new ArrayList<CatalogComponent>();
private String name;
private Integer level;


public Catalog(String name, Integer level) {
this.name = name;
this.level = level;
}

@Override
public void add(CatalogComponent catalogComponent) {
items.add(catalogComponent);
}

@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}

@Override
public void print() {
System.out.println(this.name);
for(CatalogComponent catalogComponent : items){
if(this.level != null){
for(int i = 0; i < this.level; i++){
System.out.print(" ");
}
}
catalogComponent.print();
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
public static void main(String[] args) {
CatalogComponent linuxCourse = new Course("Linux课程",11);
CatalogComponent windowsCourse = new Course("Windows课程",11);

CatalogComponent javaCourseCatalog = new Catalog("Java课程目录",2);

CatalogComponent mmallCourse1 = new Course("Java电商一期",55);
CatalogComponent mmallCourse2 = new Course("Java电商二期",66);
CatalogComponent designPattern = new Course("Java设计模式",77);

javaCourseCatalog.add(mmallCourse1);
javaCourseCatalog.add(mmallCourse2);
javaCourseCatalog.add(designPattern);

CatalogComponent mainCourseCatalog = new Catalog("课程主目录",1);
mainCourseCatalog.add(linuxCourse);
mainCourseCatalog.add(windowsCourse);
mainCourseCatalog.add(javaCourseCatalog);

mainCourseCatalog.print();
}
}

输出:

image-20231004141724348

组合模式
http://example.com/组合模式/
作者
Panyurou
发布于
2023年10月4日
许可协议