python3 简单实现组合设计模式


Posted in Python onJuly 02, 2020

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

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

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

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

#根
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)

结果为:

python3 简单实现组合设计模式

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

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

完整代码如下:

#根
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)

以上就是python3 简单实现组合设计模式的详细内容,更多关于Python 实现组合设计模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
Oct 13 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
python之django母板页面的使用
Jul 03 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
python怎么删除缓存文件
Jul 19 Python
python zip()函数的使用示例
Sep 23 Python
使用django自带的user做外键的方法
Nov 30 Python
详解Django的MVT设计模式
Apr 29 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 #Python
django 装饰器 检测登录状态操作
Jul 02 #Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 #Python
django 实现后台从富文本提取纯文本
Jul 02 #Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 #Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 #Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 #Python
You might like
PHP中比较时间大小实例
2014/08/21 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
JSON 编辑器实现代码
2009/12/06 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
django修改models重建数据库的操作
2020/03/31 Python
python如何输出反斜杠
2020/06/18 Python
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
白色公司:The White Company
2017/10/11 全球购物
请说出以下代码输出什么
2013/08/30 面试题
全国文明单位申报材料
2014/05/31 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
党员作风建设自查报告
2014/10/23 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
iPhone13再次曝光
2021/04/15 数码科技
详解vue中v-for的key唯一性
2021/05/15 Vue.js
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js