结构型模式
组合模式
定义:
- 将对象组合成树状结构,以表示:
部分-整体
的层次结构 - 组合模式使得用户对单个对象和组合对象的使用具有一致性
角色:
- 抽象组件
- 叶子组件
- 复合组件
- 客户端
实现方式
场景:公司架构
class Organization:
def __init__(self, name, decs):
self.name = name
self.desc = decs
def show(self):
pass
class CompanyOrDepartment(Organization):
def __init__(self, name, desc):
self.departments = []
super().__init__(name, desc)
def add(self, department):
self.departments.append(department)
def remove(self, department):
self.departments.remove(department)
def show(self):
print(self.name, ": ", self.desc)
for department in self.departments:
department.show()
class Employee(Organization):
def show(self):
print(self.name, ": ", self.desc)
if __name__ == '__main__':
company = CompanyOrDepartment("中国移动集团", "中国三大运营商之一")
department1 = CompanyOrDepartment("中国移动陕西分公司", "办公地址为陕西省西安市高新区高新一路3号16层")
department2 = CompanyOrDepartment("中国移动四川分公司", "办公地址为成都市高新区天府大道中段801号")
employee1 = Employee("张三", "公司氛围很棒")
employee2 = Employee("李四", "公司工作很轻松")
employee3 = Employee("王五", "工作之余喜欢打游戏")
employee4 = Employee("赵六", "工作少,可以摸鱼")
company.add(department1)
company.add(department2)
department1.add(employee3)
department1.add(employee1)
department2.add(employee1)
department2.add(employee4)
employee1.show()
print('====================================')
department1.show()
print("====================================")
company.show()
张三 : 公司氛围很棒
====================================
中国移动陕西分公司 : 办公地址为陕西省西安市高新区高新一路3号16层
王五 : 工作之余喜欢打游戏
张三 : 公司氛围很棒
====================================
中国移动集团 : 中国三大运营商之一
中国移动陕西分公司 : 办公地址为陕西省西安市高新区高新一路3号16层
王五 : 工作之余喜欢打游戏
张三 : 公司氛围很棒
中国移动四川分公司 : 办公地址为成都市高新区天府大道中段801号
张三 : 公司氛围很棒
赵六 : 工作少,可以摸鱼
使用场景
- 表示对象的
部分-整体
层次结构(特别是结构为递归的) - 希望用户忽略组合对象与单个对象的不同,用户统一的使用组合结构中的所有对象
总结
- 组合模式采用树形结构来实现普遍存在的对象容器, 从而将
一对多
的关系转化成一对一
的关系, 使得客户代码可以一致地处理对象和对象容器,无需关系处理的是单个对象,还是组合对象。 - 将
客户代码与复杂的对象容器结构
解耦是组合模式的核心, 解耦之后,客户代码将与纯粹的抽象接口–而非对象容器的内部实现结构发生依赖, 从而更能应对变化。 - 组合模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求可使用缓存技巧来改善效率。