zoukankan      html  css  js  c++  java
  • 大话设计模式Python实现-组合模式

    组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.

    下面是一个组合模式的demo:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 __author__ = 'Andy'
     5 
     6 """
     7 大话设计模式
     8 设计模式——组合模式
     9 组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.
    10 """
    11 
    12 # 抽象一个组织类
    13 class Component(object):
    14 
    15     def __init__(self, name):
    16         self.name = name
    17 
    18     def add(self,comp):
    19         pass
    20 
    21     def remove(self,comp):
    22         pass
    23 
    24     def display(self, depth):
    25         pass
    26 
    27 # 叶子节点
    28 class Leaf(Component):
    29 
    30     def add(self,comp):
    31         print '不能添加下级节点'
    32 
    33     def remove(self,comp):
    34         print '不能删除下级节点'
    35 
    36     def display(self, depth):
    37         strtemp = ''
    38         for i in range(depth):
    39             strtemp += strtemp+'-'
    40         print strtemp+self.name
    41 
    42 
    43 # 枝节点
    44 class Composite(Component):
    45 
    46     def __init__(self, name):
    47         self.name = name
    48         self.children = []
    49 
    50     def add(self,comp):
    51         self.children.append(comp)
    52 
    53     def remove(self,comp):
    54         self.children.remove(comp)
    55 
    56     def display(self, depth):
    57         strtemp = ''
    58         for i in range(depth):
    59             strtemp += strtemp+'-'
    60         print strtemp+self.name
    61         for comp in self.children:
    62             comp.display(depth+2)
    63 
    64 if __name__ == "__main__":
    65     #生成树根
    66     root = Composite("root")
    67     #根上长出2个叶子
    68     root.add(Leaf('leaf A'))
    69     root.add(Leaf('leaf B'))
    70 
    71     #根上长出树枝Composite X
    72     comp = Composite("Composite X")
    73     comp.add(Leaf('leaf XA'))
    74     comp.add(Leaf('leaf XB'))
    75     root.add(comp)
    76 
    77     #根上长出树枝Composite X
    78     comp2 = Composite("Composite XY")
    79     #Composite X长出2个叶子
    80     comp2.add(Leaf('leaf XYA'))
    81     comp2.add(Leaf('leaf XYB'))
    82     root.add(comp2)
    83     # 根上又长出2个叶子,C和D,D没张昊,掉了
    84     root.add(Leaf('Leaf C'))
    85     leaf = Leaf("Leaf D")
    86     root.add(leaf)
    87     root.remove(leaf)
    88     #展示组织
    89     root.display(1)

    上面类的设计如下图:

    应用场景:

    在需要体现部分与整体层次的结构时

    希望用户忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时


    作者:Andy
    出处:http://www.cnblogs.com/onepiece-andy/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    关于json中对象的删除
    JDBC操作数据库 封装好的工具类
    json <--->List集合,实体类 之间的相互转换
    java--->>发送邮件
    登陆的过滤器
    Hadoop + Spark 在CentOS下的伪分布式部署
    CentOS和ubuntu修改hostname的区别
    ubuntu 用户管理 adduser vs useradd
    hadoop2.6.1源码编译64位
    MySQL Binlog详解
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-composite-pattern.html
Copyright © 2011-2022 走看看