组合模式

组合模式

  • 内容

    将对象组合成树状结构表示部分-整体的层次结构。组合模式使用户对单个对象和多个对象的使用具有一致性

  • 角色

    1. 抽象组件
    2. 叶子组件
    3. 复合组件
    4. 客户段
  • 使用场景

    1. 表示对象部分-整体的层次结构。(特别是结构是递归的)

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

  • 优点

    1. 定义了包含基本对象和组合对象的类层次结构
    2. 简化客户段代码,即客户段可以一致的使用组合对象和单个对象
    3. 更容易增加新类型组件
  • 代码实例

    from abc import ABCMeta, abstractmethod
    
    
    # 抽象组件
    class Graphic(metaclass=ABCMeta):
        @abstractmethod
        def draw(self):
            pass
    
    
    # 叶子组件
    class Point(Graphic):
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def __str__(self):
            return '点%s,%s' % (self.x, self.y)
    
        def draw(self):
            print(str(self))
    
    
    # 叶子组件
    class Line(Graphic):
        def __init__(self, p1, p2):
            self.p1 = p1
            self.p2 = p2
    
        def __str__(self):
            return '线%s,%s' % (self.p1, self.p2)
    
        def draw(self):
            print(str(self))
    
    # 组合组件
    class Picture(Graphic):
        def __init__(self, iterable):
            self.childern = []
            for g in iterable:
                self.add(g)
    
        def add(self, graphic):
            self.childern.append(graphic)
    
        def draw(self):
            print('------------这个是复合图形---------------')
            for g in self.childern:
                g.draw()
    
    # 客户段
    point = Point(1, 9)
    line1 = Line(Point(4, 4), Point(7, 8))
    line2 = Line(Point(2, 6), Point(5,9))
    picture = Picture([point, line1, line2])
    picture.draw()
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值