组合模式是一种结构型设计模式,其将对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得用户对单个对象以及组合对象的使用具有一致性,可以让我们忽略对象与组合对象之间的差异,从而更加方便的进行操作。
在组合模式中,有两种类型的对象,即“叶节点”和“组合节点”。叶节点代表组合的最小单位,而组合节点则代表整个树形结构中的大节点。组合节点可以包含叶节点,也可以包含其他组合节点。在组合模式中,叶节点和组合节点都有共同的抽象类或接口,以确保对它们的访问具有一定的一致性,同时为了方便扩展,我们可以增加新的叶节点或新的组合节点。
下面是组合模式的类图:

上图中,Component是抽象基类或接口,即叶节点和组合节点的公共父类。Leaf是叶节点类,它是组合的最小单位,不包含任何子节点。Composite是组合节点类,它包含了多个子节点。客户端不需要知道具体的叶节点和组合节点。客户端可以通过组合节点访问所有的子节点,这样就可以访问整个树形结构。
组合模式可以看作是递归组合的过程,每一个组合节点都可以递归地包含其他组合节点或叶节点。组合模式的最大优点在于,它能够使代码模块化,并且能够应对复杂的层次结构。下面来看一下组合模式的应用实例。
应用实例:
Imagine有一家公司,其部门的层次结构如下图所示:

为了实现该部门结构的管理,我们可以使用组合模式。先定义一个Component接口:
```python
# component.py
from abc import ABC, abstractmethod
class Component(ABC):
@abstractmethod
def add(self, c):
pass
@abstractmethod
def remove(self, c):
pass
@abstractmethod
def display(self):
pass
```
Leaf和Composite分别作为其子类,负责管理叶节点和组合节点。Leaf类实现了add()和remove()方法,虽然这些方法不能做任何操作,但确保了其与Composite类有着相同的接口:
```python
# leaf.py
from component import Component
class Leaf(Component):
def __init__(self, name):
self.name = name
def add(self, c):
print("Cannot add to a leaf")
def remove(self, c):
print("Cannot remove from a leaf")
def display(self):
print(self.name)
```
Composite类负责管理所有子部门,它实现了add()、remove()和display()方法:
```python
# composite.py
from component import Component
class Composite(Component):
def __init__(self, name):
self.name = name
self.children = []
def add(self, c):
self.children.append(c)
def remove(self, c):
self.children.remove(c)
def display(self):
print(self.name)
for child in self.children:
print(" ", end="")
child.display()
```
最后,在客户端代码中,在使用Composite和Leaf的时候没有了区别,所有节点都可以递归地遍历它们的子节点:
``` python
# client.py
from composite import Composite
from leaf import Leaf
class Client():
def display(self, composite):
composite.display()
company = Composite("Imagine Company")
marketing = Composite("Marketing")
sales = Composite("Sales")
finance = Composite("Finance")
hr = Composite("Human Resource")
it = Composite("Information Technology")
company.add(marketing)
company.add(sales)
company.add(finance)
company.add(hr)
company.add(it)
marketing.add(Leaf("Marketing Director"))
marketing.add(Leaf("Market Research"))
sales.add(Leaf("VP Sales"))
finance.add(Leaf("CFO"))
finance.add(Leaf("Finance Director"))
hr.add(Leaf("VP Human Resource"))
it.add(Leaf("CTO"))
it.add(Leaf("System Admin"))
client = Client()
client.display(company)
```
以上就是使用组合模式进行树形结构管理的部分代码,可以看到,该模式使代码具有很好的可维护性、可扩展性和可读性。
扫码咨询 领取资料