Python设计模式之组合模式原理与用法实例分析


Posted in Python onJanuary 11, 2019

本文实例讲述了Python设计模式之组合模式原理与用法。分享给大家供大家参考,具体如下:

组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.

下面是一个组合模式的demo:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
"""
大话设计模式
设计模式——组合模式
组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.
"""
# 抽象一个组织类
class Component(object):
  def __init__(self, name):
    self.name = name
  def add(self,comp):
    pass
  def remove(self,comp):
    pass
  def display(self, depth):
    pass
# 叶子节点
class Leaf(Component):
  def add(self,comp):
    print '不能添加下级节点'
  def remove(self,comp):
    print '不能删除下级节点'
  def display(self, depth):
    strtemp = ''
    for i in range(depth):
      strtemp += strtemp+'-'
    print strtemp+self.name
# 枝节点
class Composite(Component):
  def __init__(self, name):
    self.name = name
    self.children = []
  def add(self,comp):
    self.children.append(comp)
  def remove(self,comp):
    self.children.remove(comp)
  def display(self, depth):
    strtemp = ''
    for i in range(depth):
      strtemp += strtemp+'-'
    print strtemp+self.name
    for comp in self.children:
      comp.display(depth+2)
if __name__ == "__main__":
  #生成树根
  root = Composite("root")
  #根上长出2个叶子
  root.add(Leaf('leaf A'))
  root.add(Leaf('leaf B'))
  #根上长出树枝Composite X
  comp = Composite("Composite X")
  comp.add(Leaf('leaf XA'))
  comp.add(Leaf('leaf XB'))
  root.add(comp)
  #根上长出树枝Composite X
  comp2 = Composite("Composite XY")
  #Composite X长出2个叶子
  comp2.add(Leaf('leaf XYA'))
  comp2.add(Leaf('leaf XYB'))
  root.add(comp2)
  # 根上又长出2个叶子,C和D,D没张昊,掉了
  root.add(Leaf('Leaf C'))
  leaf = Leaf("Leaf D")
  root.add(leaf)
  root.remove(leaf)
  #展示组织
  root.display(1)

运行结果如下:

Python设计模式之组合模式原理与用法实例分析

上面类的设计如下图:

Python设计模式之组合模式原理与用法实例分析

应用场景:

在需要体现部分与整体层次的结构时

希望用户忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现红包裂变算法
Feb 16 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
Python request设置HTTPS代理代码解析
Feb 12 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
PyQt5每天必学之组合框
Apr 20 Python
python redis连接 有序集合去重的代码
Aug 04 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
如何让python的运行速度得到提升
Jul 08 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
python通过配置文件共享全局变量的实例
Jan 11 #Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 #Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 #Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 #Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 #Python
Python实现批量执行同目录下的py文件方法
Jan 11 #Python
python多个模块py文件的数据共享实例
Jan 11 #Python
You might like
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
用ADODB.Stream转换
2007/01/22 Javascript
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
React组件的三种写法总结
2017/01/12 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
Python docx库用法示例分析
2019/02/16 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python 爬取疫情数据的源码
2020/02/09 Python
python如何进入交互模式
2020/07/06 Python
浅析Python 条件控制语句
2020/07/15 Python
python 下载文件的多种方法汇总
2020/11/17 Python
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
公积金单位接收函
2014/01/11 职场文书
火锅店营销方案
2014/02/26 职场文书
员工合理化建议书
2014/05/19 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL