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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
django中模板的html自动转意方法
May 27 Python
python人民币小写转大写辅助工具
Jun 20 Python
PyQt5实现简易计算器
May 30 Python
详解Python装饰器
Mar 25 Python
Python递归函数 二分查找算法实现解析
Aug 12 Python
解决python3 安装不了PIL的问题
Aug 16 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
Django实现微信小程序支付的示例代码
Sep 03 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自动生成后台导航网址的最佳方法
2013/08/27 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
PHP经典面试题集锦
2015/03/19 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
js module大战
2019/04/19 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
python如何处理程序无法打开
2020/06/16 Python
python有几个版本
2020/06/17 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
三万活动总结
2014/04/28 职场文书
会计专业求职信范文
2015/03/19 职场文书
初中军训感言
2015/08/01 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
Python+Appium自动化测试的实战
2021/06/30 Python
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang
Flink 侧流输出源码示例解析
2022/09/23 Servers