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读取环境变量的方法和自定义类分享
Nov 22 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
python如何爬取个性签名
Jun 19 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
Django 重写用户模型的实现
Jul 29 Python
python爬虫实例之获取动漫截图
May 31 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python使用建议与技巧分享(一)
Aug 17 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
python 邮件检测工具mmpi的使用
Jan 04 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 VS ASP
2006/10/09 PHP
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
jquery validate demo 基础
2015/10/29 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
Python sqlite3事务处理方法实例分析
2017/06/19 Python
使用Python进行目录的对比方法
2018/11/01 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
电子商务专业个人的自我评价分享
2013/10/29 职场文书
优秀教师先进事迹
2014/01/22 职场文书
党性分析自查总结
2014/10/14 职场文书
诚信教育主题班会
2015/08/13 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
python opencv通过4坐标剪裁图片
2021/06/05 Python
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android