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之用Python计算
Sep 12 Python
python静态方法实例
Jan 14 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
python线程池threadpool使用篇
Apr 27 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Python print不能立即打印的解决方式
Feb 19 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
python 统计代码耗时的几种方法分享
Apr 02 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
德生PL660的电路分析和打磨
2021/03/02 无线电
实用函数7
2007/11/08 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
python安装本地whl的实例步骤
2019/10/12 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
python脚本定时发送邮件
2020/12/22 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
文员岗位职责范本
2014/03/08 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书