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 相关文章推荐
python实现斐波那契递归函数的方法
Sep 08 Python
利用python发送和接收邮件
Sep 27 Python
python验证码识别的示例代码
Sep 21 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
详解python polyscope库的安装和例程
Nov 13 Python
python区块链持久化和命令行接口实现简版
May 25 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迭代器的内部执行过程详解
2013/11/12 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
python每天定时运行某程序代码
2019/08/16 Python
python中count函数简单的实例讲解
2020/02/06 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
Python小白垃圾回收机制入门
2020/06/09 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
C++的几个面试题附答案
2016/08/03 面试题
小学教师个人总结
2015/02/05 职场文书
导游词之千岛湖
2019/09/23 职场文书