组合模式
浏览 1128
课文
组合模式(Composite Pattern)
情景
小钱是一名程序员,在一个规模很大的公司工作。现在需要完成这样的功能:点开公司的介绍,下面会展示其所有的子公司与其子公司的子公司……直至展示完整。小钱心想,可以考虑用递归的方式完成该展示功能,写出了下面的代码:
# 类里自带子公司列表
class Company:
def __init__(self, name):
self.name = name
self.child_companies = []
# 提供子公司列表的增删操作
def add(self, child_company):
self.child_companies.append(child_company)
def remove(self, child_company):
self.child_companies.remove(child_company)
# 给定一个参数num表示层级,递归调用子公司的show方法,且层级自增
def show(self, num):
print('-' * num + self.name)
for child_company in self.child_companies:
child_company.show(num + 1)
假设 A 为总公司,B、C 为 A 的子公司,D、E 为 B 的子公司,F 为 C 的子公司,那么:
A, B, C, D, E, F = (
Company('A'),
Company('B'),
Company('C'),
Company('D'),
Company('E'),
Company('F'),
)
# B、C加入A的子公司列表
A.add(B)
A.add(C)
# D、E加入B的子公司列表
B.add(D)
B.add(E)
# F加入C的子公司列表
C.add(F)
# 调用总公司A的show方法展示公司层级结构,0表示A公司展示层级为0
A.show(0)
输出:
A
-B
--D
--E
-C
--F
这种利用递归思想的模式称为组合模式。
正文
组合模式将对象表示成了一个「部分-整体」的树形结构。对于 B 公司来说,它既是 D、E 的母公司,也是 A 的子公司。如果需要实现树状对象结构,就可以考虑使用组合模式。通常对象内部包含一个叶节点(例中为name
属性)以及一个包含子元素的复杂容器(例中为child_company
属性),并声明一系列方法(例中为show
方法),能够在调用时对自身以及子元素都起作用。
评论
暂无评论