📜  构图模式(1)

📅  最后修改于: 2023-12-03 15:10:42.233000             🧑  作者: Mango

构图模式

构图模式是一种设计模式,它主要关注如何把对象组合成复杂的结构,使得这些对象可以同时被操作和管理。

定义

构图模式又称为组合模式,它可以让你将对象组合成树形结构来表现”部分-整体“的层次结构。构图模式使得客户端以一致的方式处理单个对象以及对象的组合。

UML

构图模式UML

构图模式中主要有三种角色:

  • Component,抽象构件角色,定义了叶子和容器组件的共同点并声明了所有叶子和容器都有的操作。可以是抽象类或接口。
  • Leaf,叶子构件角色,表示一个叶子节点。没有任何子节点。
  • Composite,容器构件角色,容纳其他组件,作为容器角色必须有添加和删除子节点的方法,可以在其中遍历它的子节点。在需要处理整个树形结构时,容器构件角色会递归调用它的子节点。
示例

以下是以公司组织架构为例子的构图模式实现。

from abc import ABC, abstractmethod

class Component(ABC):
    @abstractmethod
    def show(self, indent):
        pass

class Employee(Component):
    def __init__(self, name, position, salary):
        self.name = name
        self.position = position
        self.salary = salary

    def show(self, indent):
        print(f'{indent}- {self.name}, {self.position}, {self.salary}')

class Department(Component):
    def __init__(self, name, employees=None):
        self.name = name
        self.employees = employees or []

    def add_employee(self, employee):
        self.employees.append(employee)

    def remove_employee(self, employee):
        self.employees.remove(employee)

    def show(self, indent=''):
        print(f'{indent}Department: {self.name}')
        for employee in self.employees:
            employee.show(indent + '\t')

if __name__ == "__main__":
    hr_department = Department('HR')
    hr_department.add_employee(Employee('John', 'HR manager', 10000))
    hr_department.add_employee(Employee('Mary', 'HR assistant', 3000))

    rd_department = Department('R&D')
    rd_department.add_employee(Employee('Bob', 'Software engineer', 5000))
    rd_department.add_employee(Employee('Alice', 'Product manager', 8000))

    company = Department('Company')
    company.add_employee(hr_department)
    company.add_employee(rd_department)

    company.show()

输出:

Department: Company
	Department: HR
		- John, HR manager, 10000
		- Mary, HR assistant, 3000
	Department: R&D
		- Bob, Software engineer, 5000
		- Alice, Product manager, 8000
优点
  • 简化客户端代码,客户端只需调用高层模块即可,不需关心底层模块的细节。
  • 容易增加新的组件,只需新增一个叶子或容器组件即可。
  • 构图模式可以让我们用树形结构来表示对象的部分-整体层次关系,并以此来处理整个结构。
总结

构图模式让我们以一致的方式处理单个对象以及对象的组合,它可以让我们建立一颗对象树,将对象组合成复杂的结构,从而使得这些对象可以同时被操作和管理。