最开始接触组合设计模式是在大话设计模式这本书中的案例,讲的是让你设计一个公司的组织架构,一个总公司下有人力资源部门,IT部门, 财务部门,还有广州分公司、深圳分公司,在分公司下也有IT部门和财务部门,让你用代码构建出来,然后在自学数据结构关于树型结构的时候,让你用python代码实现一个二叉树, 最后第三次是在学习李建忠老师的23种设计模式时,感觉打通了任督二脉,明白组合设计模式本质上是一种树形的数据结构型模式。为什么这么说呢,接下来我们看一下它的官方定义和示例。

组合设计模式GOF官方定义: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

类结构图如下:

首先我们用python代码和组合设计模式来实现一个公司的组织架构。

01、设计节点基类

classDepartment:"""部门基类"""

def __init__(self, name):

self.name=namedefdisplay(self):pass

classCompany(Department):"""公司基类"""

def __init__(self, name):

self.department_list=list()

super().__init__(name)defadd(self, department: Department):

self.department_list.append(department)defremove(self, department: Department):

self.department_list.remove(department)defdisplay(self, a=None):#这里有点递归的味道

for department inself.department_list:

department.display(self.name)

02、设计部门类

classITDepartment(Department):"""IT部门"""

defdisplay(self, company):print("这是" + company +self.name)classFinanceDepartment(Department):"""财务部门"""

defdisplay(self, company):print("这是" + company + self.name)

03、设计分公司类

classGuangZhouCompany(Company):"""广州分公司"""

classShenZhenCompany(Company):"""深圳分公司"""

04、设计和运行主程序

if __name__ == "__main__":

root= Company("总公司")

g_company= GuangZhouCompany("广州分公司")

s_company= ShenZhenCompany("深圳分公司")

it_department= ITDepartment("总部IT部门")

git_department= ITDepartment("广州IT部门")

sit_department= ITDepartment("深圳IT部门")

f_department= FinanceDepartment("总部财务部门")

gf_department= FinanceDepartment("广州财务部门")

sf_department= FinanceDepartment("深圳财务部门")

root.add(g_company)

root.add(s_company)

root.add(it_department)

root.add(f_department)

g_company.add(git_department)

g_company.add(gf_department)

s_company.add(sf_department)

s_company.add(sit_department)

root.display(None)

运行结果如下:

/usr/local/bin/python3.7 /Users/bytedance/PycharmProjects/untitled3/组合设计模式/组合设计模式.py

这是广州分公司广州IT部门

这是广州分公司广州财务部门

这是深圳分公司深圳财务部门

这是深圳分公司深圳IT部门

这是总公司总部IT部门

这是总公司总部财务部门

Process finished with exit code 0

05、总结

组合模式采用树形结构来实现普遍存在的对象容器, 从而将“一对多”的关系转化成“一对一”的关系, 使得客户代码可以一致地处理对象和对象容器,无需关系处理的是单个对象,还是组合对象。

将“客户代码与复杂的对象容器结构”解耦是组合模式的核心, 解耦之后,客户代码将与纯粹的抽象接口--而非对象容器的内部实现结构发生依赖, 从而更能应对变化。

组合模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求可使用缓存技巧来改善效率。

python文件合法模式组合_python设计模式之组合模式相关推荐

  1. python文件合法模式组合_以下选项中,不是Python文件二进制打开模式的合法组合是...

    以下选项中,不是Python文件二进制打开模式的合法组合是 答:\"x+\" 建立良好的谈判气氛主要是在( )阶段 答:开局 the ruling class had long b ...

  2. python实现解释器_Python设计模式之解释器模式

    解释器模式 对每个应用来说,至少有以下两种不同的用户分类. 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就足够了. 高级用户:这些用户, ...

  3. python的out模式_Python设计模式之状态模式

    状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态机?状态机是一个抽象机 ...

  4. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  5. python设计模式名片_Python设计模式之门面模式简单示例

    本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...

  6. python 命令模式_python 设计模式之命令模式

    命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...

  7. load()是python文件操作的函数_Python 文件读写

    &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp 预备知识 Python 入门 学习处理文件和保存数据可让你的 ...

  8. python文件编码与解码_Python读取文件编码解码问题

    原博文 2018-04-19 12:51 − #### 用chardet检测编码 ``` import chardet raw = open("model.json", 'rb') ...

  9. python文件读取写入实践_python文件写入实例分析

    本文实例讲述了python文件写入的用法.分享给大家供大家参考.具体分析如下: Python中wirte()方法把字符串写入文件,writelines()方法可以把列表中存储的内容写入文件. f=fi ...

最新文章

  1. Java8中Lambda表达式的10个例子
  2. 微信小程序去除左上角返回的按钮
  3. java 把依赖打到一个整体jar包里运行(maven)
  4. 《Pytorch - CNN模型》
  5. pe系统如何读取手机_图文详解怎么用pe重做系统
  6. ROG幻14 AMD R7-4800H VM16安装macOS Catalina 10.15教程
  7. 清理vdbench后台进程
  8. nlp基础—12.LSTM-CRF模型介绍
  9. FPGA 入门 (一)
  10. 永洪BI产品体验(一)数据源模块
  11. 【H∞控制】H无穷控制器的matlab仿真
  12. 看不懂英文文档,是我们英语太差吗?
  13. 牛逼!你竟然把VSCode玩成了IDEA的效果,有点哇塞。。。
  14. 六、路由(routing)
  15. 游程编码压缩及解压缩
  16. 2021-05-22 黑板异或游戏
  17. randn与rand的区别
  18. java.lang.arrayindexoutofboundsexception: Index 13 out of bounds for length 13
  19. 【经验分享】20武汉理工计算机考研
  20. 2020.1.13 C语言学习 结构体+结构体数组+结构体指针

热门文章

  1. elasticsearch 启动、停止及更改密码
  2. java线程----生产者和消费者问题
  3. 左神算法:反转单向和双向链表(Java版)
  4. 【Java】HashMap的数据结构、源码解析 - 公开课笔记
  5. javascript中的闭包closure详解
  6. Spring Boot Admin的使用
  7. python生物数据分析师职业技能_数据分析行业各个职业需要的技能是什么?
  8. 各种说明方法的答题格式_高中化学:选择题答题方法与知识点总结,让你轻松秒杀各种难题...
  9. richtextbox自动滚动到最下面_自动滚动式连续真空包装机简介
  10. Effective Java之优先使用标准的异常(六十)