组合模式

浏览 559

课文

### 组合模式(Composite Pattern) **情景** 小钱是一名程序员,在一个规模很大的公司工作。现在需要完成这样的功能:点开公司的介绍,下面会展示其所有的子公司与其子公司的子公司……直至展示完整。小钱心想,可以考虑用递归的方式完成该展示功能,写出了下面的代码: ```python # 类里自带子公司列表 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 的子公司,那么: ```python 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) ``` 输出: ```output A -B --D --E -C --F ``` 这种利用递归思想的模式称为组合模式。 **正文** 组合模式将对象表示成了一个「部分-整体」的树形结构。对于 B 公司来说,它既是 D、E 的母公司,也是 A 的子公司。如果需要实现树状对象结构,就可以考虑使用组合模式。通常对象内部包含一个叶节点(例中为`name`属性)以及一个包含子元素的复杂容器(例中为`child_company`属性),并声明一系列方法(例中为`show`方法),能够在调用时对自身以及子元素都起作用。

评论

登录参与讨论

暂无评论

共 0 条
  • 1
前往
  • 1