组合模式是把一个类别归为一个整体,并且组织多个整体之间的关系,使用通过树形结构来描述所有整体。

一般的编写方式为一个类别对象下添加多个该对象的元素,该对象又为其它对象下的元素。简单来说就是一个学校有一个总部,总部下有有师资部、招生部;总部有分校,分校也有。

在我个人看来,设计模式的使用并不局限于书本描述的具体问题的解决,是需要丰富的业务经验才能更好的灵活应用,本人能力有限,在此也是给出一个简单的示例用来说明,额外的灵活运营需要看个人的编写方式。

首先新建一个学校的基类:

#根
class root:
name = ''
def __init__(self, name):
self.name = name
def add(self, root):
pass

以上学校基类初始化方法为接收一个name,并且有一个抽象方法add。

有了一个学校基类后,具体新建一个学校类,继承root基类:

#学校类
class School(root):
childrenroot = []
def add(self, root):
self.childrenroot.append(root)

在以上学校类中,继承了root基类,并且实现了add方法,接收root值,并且把它添加到 childrenroot 列表中,这样可以网当前对象下添加子节点,或者说添加下级对象。

新建一个招生办类以及一个师资部类:

#招生办
class StudentAdmissionDept(root):
def __init__(self, name):
self.name = name
#师资部
class FacultyDepartment(root):
def __init__(self, name):
self.name = name

以上内容很简单,都是继承于root,就一个初始化方法。

开始实现调用。首先新建一个学校总部对象,并且往这个总部对象下添加一个招生办对象以及一个师资部对象:

root = School('总部')
root.add(StudentAdmissionDept('总部招生办'))
root.add(FacultyDepartment('总部师资部'))

新建好总部对象后,往下添加分校区的对象。分校区的部门设置跟总校一致:

s1 = School('桂林校区')
s1.add(StudentAdmissionDept('桂林校区 招生办'))
s1.add(FacultyDepartment('桂林校区 师资部'))
root.add(s1)

在配置完第一个桂林校区后,使用root总部的add方法,添加当前桂林校区为下级。

再新建几个校区:

s2 = School('深圳校区')
s2.add(StudentAdmissionDept('深圳校区 招生办'))
s2.add(FacultyDepartment('深圳校区 师资部'))
root.add(s2) s3 = School('广州校区')
s3.add(StudentAdmissionDept('广州校区 招生办'))
s3.add(FacultyDepartment('广州校区 师资部'))
root.add(s3)

以上配置方法跟第一个校区配置为root总部校区下级一致。

最后使用遍历打印出各个校区的名字:

print('\n',root.name,'下级学校层级:\n')

for i in root.childrenroot:
print(i.name)

结果为:



由于没有排版,以上结果并没有很好的直观显示层级,剩下的只需要自己排版输出即可。

在当前文章对应的代码编写中,最后的新建校区及配置信息,可以新建一个类,封装好该调用、输出方法,可以很方便的使用组合设计模式。

完整代码如下:

#根
class root:
name = ''
def __init__(self, name):
self.name = name
def add(self, root):
pass #学校类
class School(root):
childrenroot = []
def add(self, root):
self.childrenroot.append(root) #招生办
class StudentAdmissionDept(root):
def __init__(self, name):
self.name = name #师资部
class FacultyDepartment(root):
def __init__(self, name):
self.name = name root = School('总部')
root.add(StudentAdmissionDept('总部招生办'))
root.add(FacultyDepartment('总部师资部')) s1 = School('桂林校区')
s1.add(StudentAdmissionDept('桂林校区 招生办'))
s1.add(FacultyDepartment('桂林校区 师资部'))
root.add(s1) s2 = School('深圳校区')
s2.add(StudentAdmissionDept('深圳校区 招生办'))
s2.add(FacultyDepartment('深圳校区 师资部'))
root.add(s2) s3 = School('广州校区')
s3.add(StudentAdmissionDept('广州校区 招生办'))
s3.add(FacultyDepartment('广州校区 师资部'))
root.add(s3) print('\n',root.name,'下级学校层级:\n') for i in root.childrenroot:
print(i.name)

最新文章

  1. VR外包 虚拟现实外包 北京软件公司
  2. linux系统安装软件方法大全
  3. Qt自定义窗体,边框,圆角窗体
  4. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
  5. nginx 负载均衡服务器的双机搞可用
  6. 基于JAVA网络编程的聊天小程序
  7. 构建可比较的对象(IComparable)
  8. 第三章 霍夫变换(Hough Transform)
  9. 必问的Java集合框架面试题
  10. 2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia
  11. Kali Linux渗透测试实战 2.1 DNS信息收集
  12. Linux上shell脚本,字符串转ASCII码
  13. GitHub没有实时通知怎么办?当然是自己上手写一个啊!
  14. Mybatis系列(四):Mybatis缓存
  15. vs2015如何设置类或函数前不显示引用的数量
  16. Splay 模板
  17. WEB安全番外第六篇--关于通过记录渗透工具的Payload来总结和学习测试用例
  18. [C#] 实现可设置超时的 Task
  19. Logstash IIS日志采集
  20. 封装element-ui的dialog组件

热门文章

  1. git 常用命令--超实用
  2. Python定时任务利器—Apscheduler
  3. swig python dynamic module does not define init function
  4. Open_basedir绕过
  5. angular8 大地老师学习笔记---第九课
  6. Linux系列之makefile的简单入门
  7. centos7安装Hive及其问题解决
  8. Vue必须必须要注意的几个细节
  9. EF Core 封装方法Expression<Func<TObject, bool>>与Func<TObject, bool>区别
  10. arp欺骗(理论)