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 enumerate遍历数组示例应用
Sep 06 Python
python开发之基于thread线程搜索本地文件的方法
Nov 11 Python
详解Python中的动态属性和特性
Apr 07 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
python实现决策树ID3算法的示例代码
May 30 Python
关于python写入文件自动换行的问题
Jun 23 Python
python求最大连续子数组的和
Jul 07 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
python文件选择对话框的操作方法
Jun 27 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
python with (as)语句实例详解
Feb 04 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 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
一个好用的分页函数
2006/11/16 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
记录mysql性能查询过程的使用方法
2013/05/02 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
页面中js执行顺序
2009/11/09 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
python实现简单中文词频统计示例
2017/11/08 Python
python实现xlsx文件分析详解
2018/01/02 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
Python之用户输入的实例
2018/06/22 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
加拿大探亲邀请信
2014/01/28 职场文书
服务员岗位责任制
2014/02/11 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
业务员岗位职责
2015/02/03 职场文书
化验室岗位职责
2015/02/14 职场文书
故意伤害辩护词
2015/05/21 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS