希赛考试网
首页 > 软考 > 软件设计师

组合模式类图

希赛网 2024-06-17 15:06:22

组合模式是一种结构型设计模式,其将对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得用户对单个对象以及组合对象的使用具有一致性,可以让我们忽略对象与组合对象之间的差异,从而更加方便的进行操作。

在组合模式中,有两种类型的对象,即“叶节点”和“组合节点”。叶节点代表组合的最小单位,而组合节点则代表整个树形结构中的大节点。组合节点可以包含叶节点,也可以包含其他组合节点。在组合模式中,叶节点和组合节点都有共同的抽象类或接口,以确保对它们的访问具有一定的一致性,同时为了方便扩展,我们可以增加新的叶节点或新的组合节点。

下面是组合模式的类图:

![组合模式类图](https://i.imgur.com/uInzqMI.png)

上图中,Component是抽象基类或接口,即叶节点和组合节点的公共父类。Leaf是叶节点类,它是组合的最小单位,不包含任何子节点。Composite是组合节点类,它包含了多个子节点。客户端不需要知道具体的叶节点和组合节点。客户端可以通过组合节点访问所有的子节点,这样就可以访问整个树形结构。

组合模式可以看作是递归组合的过程,每一个组合节点都可以递归地包含其他组合节点或叶节点。组合模式的最大优点在于,它能够使代码模块化,并且能够应对复杂的层次结构。下面来看一下组合模式的应用实例。

应用实例:

Imagine有一家公司,其部门的层次结构如下图所示:

![公司部门图](https://i.imgur.com/kwOcRin.png)

为了实现该部门结构的管理,我们可以使用组合模式。先定义一个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)

```

以上就是使用组合模式进行树形结构管理的部分代码,可以看到,该模式使代码具有很好的可维护性、可扩展性和可读性。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件