python3 最基本且简单的实现组合设计模式
2024-08-24 09:30:37
组合模式是把一个类别归为一个整体,并且组织多个整体之间的关系,使用通过树形结构来描述所有整体。
一般的编写方式为一个类别对象下添加多个该对象的元素,该对象又为其它对象下的元素。简单来说就是一个学校有一个总部,总部下有有师资部、招生部;总部有分校,分校也有。
在我个人看来,设计模式的使用并不局限于书本描述的具体问题的解决,是需要丰富的业务经验才能更好的灵活应用,本人能力有限,在此也是给出一个简单的示例用来说明,额外的灵活运营需要看个人的编写方式。
首先新建一个学校的基类:
#根
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)
最新文章
- VR外包 虚拟现实外包 北京软件公司
- linux系统安装软件方法大全
- Qt自定义窗体,边框,圆角窗体
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
- nginx 负载均衡服务器的双机搞可用
- 基于JAVA网络编程的聊天小程序
- 构建可比较的对象(IComparable)
- 第三章 霍夫变换(Hough Transform)
- 必问的Java集合框架面试题
- 2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia
- Kali Linux渗透测试实战 2.1 DNS信息收集
- Linux上shell脚本,字符串转ASCII码
- GitHub没有实时通知怎么办?当然是自己上手写一个啊!
- Mybatis系列(四):Mybatis缓存
- vs2015如何设置类或函数前不显示引用的数量
- Splay 模板
- WEB安全番外第六篇--关于通过记录渗透工具的Payload来总结和学习测试用例
- [C#] 实现可设置超时的 Task
- Logstash IIS日志采集
- 封装element-ui的dialog组件
热门文章
- git 常用命令--超实用
- Python定时任务利器—Apscheduler
- swig python dynamic module does not define init function
- Open_basedir绕过
- angular8 大地老师学习笔记---第九课
- Linux系列之makefile的简单入门
- centos7安装Hive及其问题解决
- Vue必须必须要注意的几个细节
- EF Core 封装方法Expression<;Func<;TObject, bool>;>;与Func<;TObject, bool>;区别
- arp欺骗(理论)