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中的一些陷阱与技巧小结
Jul 10 Python
Python与Java间Socket通信实例代码
Mar 06 Python
python中文件变化监控示例(watchdog)
Oct 16 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
详解python做UI界面的方法
Feb 27 Python
python实现ip代理池功能示例
Jul 05 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
Python在字符串中处理html和xml的方法
Jul 31 Python
python 代码运行时间获取方式详解
Sep 18 Python
使用python实现学生信息管理系统
Feb 25 Python
编写python程序的90条建议
Apr 14 Python
python中pycryto实现数据加密
Apr 29 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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP设置进度条的方法
2015/07/08 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
python中int与str互转方法
2018/07/02 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
十周年庆典策划方案
2014/06/03 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
撤诉申请怎么写
2015/05/19 职场文书
焦点访谈观后感
2015/06/11 职场文书
独生子女证明范本
2015/06/19 职场文书
python保存图片的四个常用方法
2022/02/28 Python
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技