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使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
Python的randrange()方法使用教程
May 15 Python
简单介绍Python的Django框架的dj-scaffold项目
May 30 Python
python 类详解及简单实例
Mar 24 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
Python中的枚举类型示例介绍
Jan 09 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python 下载及安装详细步骤
Nov 04 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 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中filter函数校验数据的方法详解
2015/07/31 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
Yii rules常用规则示例
2016/03/15 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
vue $set 给数据赋值的实例
2019/11/09 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Python 元组操作总结
2019/09/18 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
使用python模拟高斯分布例子
2019/12/09 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
python3 logging日志封装实例
2020/04/08 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
教师节演讲稿
2014/05/06 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书