zoukankan      html  css  js  c++  java
  • 组合模式

    将对象组合成树形结构,以表示 部分-整体 的层次结构。使得用户对单个对象和组合对象的使用具有一致性
    是一种 弱的拥有关系 
    优点:用户可以一致的使用 组合结构和单个对象
    应用场景:当需求中体现 部分与整体 的层次结构时,以及你希望用户忽略组合对象与单个对象的不同,统一使用组合中的所有对象时,就应该考虑组合模式。

    代码示例

    # 抽象类、接口
    class Company(object):
        def __init__(self, name):
            self.name = name
        def Add(self,c): pass
        def Remove(self, c): pass
        def Display(self,depth): pass
        def LineOfDuty(self): pass
    # 具体公司类
    class ConcreteCompany(Company):
        def __init__(self, name):
            self.name = name
            self.L = []
        def Add(self,c):
            self.L.append(c)
        def Display(self,depth):
            s='-'*depth+self.name
            print(s)
            for component in self.L:
                component.Display(depth+2)
        def LineOfDuty(self):
            for component in self.L:
                component.LineOfDuty()
    # 人力资源
    class HRDepartment(Company):
        def Add(self,c): pass
        def Remove(self, c): pass
        def Display(self,depth):
            s = '#' * depth + self.name
            print(s)
        def LineOfDuty(self):
            print(self.name, "员工招聘")
    # 财务部
    class FinanceDepartment(Company):
        def Add(self,c): pass
        def Remove(self, c): pass
        def Display(self,depth):
            s = '#' * depth + self.name
            print(s)
        def LineOfDuty(self):
            print(self.name, "财务收支")
    root = ConcreteCompany("北京总公司")
    root.Add(HRDepartment("总公司人力资源部"))
    root.Add(FinanceDepartment("总公司财务部"))
    comp = ConcreteCompany("华东分公司")
    comp.Add(HRDepartment("华东分公司人力资源部"))
    comp.Add(FinanceDepartment("华东分公司财务部"))
    root.Add(comp)
    comp2 = ConcreteCompany("南京办事处")
    comp2.Add(HRDepartment("南京办事处人力资源部"))
    comp2.Add(FinanceDepartment("南京公司财务部"))
    root.Add(comp2)
    # comp.Add(comp2)  # 个人觉得注释 52和57行 结构更清楚
    # root.Add(comp)
    print("公司结构图")
    root.Display(1)
    print("部门职责")
    root.LineOfDuty()

  • 相关阅读:
    系统架构设计师考试大纲
    常用数据结构及复杂度( 转)
    八种主流NoSQL数据库系统对比(转)
    C# Redis Server分布式缓存编程(二)(转)
    C# Redis Server分布式缓存编程(一)(转)
    js去掉字符串前后空格的五种方法(转)
    给力分享新的ORM => Dapper( 转)
    我所经历的“余额宝”的那些故事(转)
    在PowerDesigner中设计物理模型1——表和主外键(转)
    Object.keys(obj)
  • 原文地址:https://www.cnblogs.com/hanqian/p/7531500.html
Copyright © 2011-2022 走看看