【程序设计】Python的组合模式

组合模式也叫作部分-模式整体


对象组合分类中翻译树形结构以表示“ 部分 ”和“ 整体 ”的层次结构,使得用户对单个对象和组合对象的使用具有一致性



优点:

1,节点增加和减少是非常自由和方便的,这也是树形结构的一大特点;
2,所有节点,不管是分支节点还是叶子结点,不管是调用一个结点,还是调用一个结点群,都是非常方便的。

使用场景:

1,维护部分与整体的逻辑关系,或者动态调用整体或部分的功能接口,可以考虑使用组合模式。例如,非常多的操作系统(如Linux)都把文件系统设计成树形结构,再比如说分布式应用中借助动物园管理员,也可以组织和调用分布式集群中的结点功能



缺点

1,由于叶子结点和分支结点直接使用了实现类,而不方便使用抽象类,这大大限制了接口的影响范围;若结点接口发生变更,对系统造成的风险会比较大。


流程图:



蟒蛇代码实现:

“””

组合模式
“””


#树形的公司结构
class公司:
    name =''
    def __init __(self,name):
        self.name = name
    def add(self,company):
        通过
    def remove(self,company):
        通过
    def display(self,depth):
        通过
    def listDuty(self):
        通过

class ConcreteCompany(Company):
    childrenCompany = None
    def __init__(self, name):
        Company.__init__(self,name)
        self.childrenCompany = []
    def add(self, company):
        self.childrenCompany.append(company)
    def remove(self, company):
        self.childrenCompany.remove(company)
    def display(self, depth):
        print ('-' * depth + self.name)
        for component in self.childrenCompany:
            component.display(depth+1)
    def listDuty(self):
        for component in self.childrenCompany:
            component.listDuty()
class HRDepartment(Company):
    def __init__(self, name):
         Company.__init__(self,name)
    def display(self, depth):
        print ('-' * depth + self.name)

    def listDuty(self): #履行职责
        print ('%s\t 过户登记和管理.' % self.name)


class FinanceDepartment(Company):
    def __init__(self, name):
        Company.__init__(self,name)
    def display(self, depth):
        print ("-" * depth + self.name)

    def listDuty(self): #履行职责
        print ('%s\t财务管理.' % self.name)


class RdDepartment(Company):
    def __init__(self,name):
        Company.__init__(self,name)
    def display(self, depth):
        print ("-" * depth + self.name)

    def listDuty(self):
        print ("%s\t研发." % self.name)



# 总公司下设东边的分公司一个,东边的分公司下设东北公司和东南公司,
# 显示公司层级,并罗列这些的公司中各部门的职责,
if __name__=="__main__":
    root = ConcreteCompany('总公司')
    root.add(HRDepartment('总部人力资源'))
    root.add(FinanceDepartment('总部财务'))
    root.add(RdDepartment("总部研发"))

    comp = ConcreteCompany('东边分公司')
    comp.add(HRDepartment('东边分公司。人力资源'))
    comp.add(FinanceDepartment('东边分公司.财政'))
    comp.add(RdDepartment("东边分公司.研发"))
    root.add(comp)

    comp1 = ConcreteCompany('东北 分公司')
    comp1.add(HRDepartment('东北.人力资源'))
    comp1.add(FinanceDepartment('东北.财政'))
    comp1.add(RdDepartment( “东北。研发”))
    comp.add(COMP1)

    comp2 = ConcreteCompany('东南分公司')
    comp2.add(HRDepartment( '东南。人力资源'))
    comp2.add(FinanceDepartment( '东南。财政'))
    comp2.add(RdDepartment( “东南。研发”))
    comp.add(COMP2)

    root.display(1)

    root.listDuty()





译文:https : //yq.aliyun.com/articles/70535

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值