组合模式

浏览 1305

课文

组合模式(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方法),能够在调用时对自身以及子元素都起作用。

评论

登录参与讨论

暂无评论

共 0 条
  • 1
前往
  • 1