python设计模式8-组合模式

1. 组合模式(Composite)介绍

UML类图

在这里插入图片描述

角色介绍

  • Component:为组合模式中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为,声明一个接口用于访问和管理其子组件;在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现。
  • Leaf:在组合模式中表示叶节点对象,叶节点对象没有子节点,实现 Component 的所有方法。
  • Composite:表示组合部件(注意部件带有子部件),实现操纵子部件的所有方法;实现所有在 Component 的操作。
  • Client:通过 Component 接口操纵组合部件的对象。

组合模式的优点

  • 定义了包含基本对象和组合对象的类层次结构,基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合。
  • 简化了客户代码。客户可以一致的使用组合对象和单个对象,通常用户不知道处理的是一个叶节点还是一个组合组件。
  • 使得更容易增加新类型的组件。新定义的 Composite 和 Leaf 子类自动与已有的结构和客户代码一起工作,客户程序不需要因为新的 Component 类而去改变。
  • 使设计变得更通用。

2. 示例

各组成部分的协作过程是,用户使用 Component 类接口与组合结构中的对象进行交互。如果接受者是一个 Leaf,则直接处理请求;如果接受者是 Composite,则通常将请求发送给其子部件,在转发请求之前或之后可能执行一些辅助操作。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''Composite Pattern with Python Code
'''

from abc import abstractmethod, ABCMeta


# 为组合模式中的对象声明接口
class Component(metaclass=ABCMeta):
    def __init__(self, name):
        self.name = name

    @abstractmethod
    def operation(self, depth):
        pass

    @abstractmethod
    def add(self, c):
        pass

    @abstractmethod
    def remove(self, c):
        pass

    @abstractmethod
    def get_child(self, index):
        pass


# 表示组合部件
class Composite(Component):
    def __init__(self, name):
        Component.__init__(self, name)
        self.children = []

    def operation(self, depth):
        strtemp = ''
        for i in range(depth):
            strtemp += strtemp+'-'
        print(strtemp+self.name)
        for comp in self.children:
            comp.operation(depth+2)

    def add(self, c):
        self.children.append(c)

    def remove(self, c):
        self.children.remove(c)

    def get_child(self, index):
        return self.children[index]


# 表示叶节点对象,叶节点对象没有子节点,实现 Component 的所有方法
class Leaf(Component):
    def operation(self, depth):
        strtemp = ''
        for i in range(depth):
            strtemp += strtemp+'-'
        print(strtemp+self.name)

    def add(self, c):
        print('不能添加下级节点!')

    def remove(self, c):
        print('不能删除下级节点!')

    def get_child(self, index):
        print('没有下级节点!')


class Client(object):
    @staticmethod
    def 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.operation(1)


if __name__ == '__main__':
    Client.main()

输出:

# ./Composite.py 
-root
-------leaf A
-------leaf B
-------Composite X
-------------------------------leaf XA
-------------------------------leaf XB
-------Composite XY
-------------------------------leaf XYA
-------------------------------leaf XYB
-------Leaf C

参考:
http://c.biancheng.net/view/1373.html
https://cloud.tencent.com/developer/article/1473740

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值