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检测网页是否有日常链接
Jun 03 Python
Python通过poll实现异步IO的方法
Jun 04 Python
深入源码解析Python中的对象与类型
Dec 11 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
Python File(文件) 方法整理
Feb 18 Python
python实现画循环圆
Nov 23 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
python入门之井字棋小游戏
Mar 05 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Django设置Postgresql的操作
May 14 Python
python 动态绘制爱心的示例
Sep 27 Python
python 实现弹球游戏的示例代码
Nov 17 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/09/30 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
详解如何运行vue项目
2019/04/15 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
实例详解Python模块decimal
2019/06/26 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
酒店拾金不昧表扬信
2014/01/18 职场文书
小学教师自我评价
2015/03/04 职场文书
经理岗位职责范本
2015/04/15 职场文书
医者仁心观后感
2015/06/17 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle