递归对象的设计模式

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 递归对象的设计模式

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

组合模式

1、内容

对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下我们希望一致地处理它们,因为对于这些对象的区别对待将会使得程序非常复杂。组合模式为解决此类问题而诞生,它可以让叶子对象和容器对象的使用具有一致性。

2、角色

  • 抽象组件
  • 叶子组件
  • 复合组件
  • 客户端
  • 3、使用场景

  • 表示对象的‘部分-整体’层次结构(特别是结构是递归的)
  • 希望用户忽略组合对象与单个对象的不同,用户统一的使用组合结构中的所有对象
  • 4、优点  

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

  • 5、缺点

  • 很难限制组合中的组件
  • 6、代码示例

    
    from abc import abstractmethod,ABCMeta
    class Graphic(metaclass=ABCMeta):
        '''图形类'''
        @abstractmethod
        def draw(self):
            pass
    
        @abstractmethod
        def add(self,graphic):
            pass
    
        @abstractmethod
        def getchildren(self,graphic):
            pass
    
    class Point(Graphic):
        '''点'''
        def __init__(self,x,y):
            self.x = x
            self.y = y
    
        def draw(self):
            print(self)
    
        def add(self,graphic):
            raise TypeError
    
        def getchildren(self,graphic):
            raise TypeError
    
        def __str__(self):
            return '点(%s,%s)' %(self.x,self.y)
    
    class Line(Graphic):
        def __init__(self, p1, p2):
            self.p1 = p1
            self.p2 = p2
    
        def draw(self):
            print(self)
    
        def add(self, graphic):
            raise TypeError
    
        def getchildren(self):
            raise TypeError
    
        def __str__(self):
            return "线段[%s, %s]" % (self.p1, self.p2)
    
    class Picture(Graphic):
        def __init__(self):
            self.children = []
    
        def add(self,graphic):
            self.children.append(graphic)
    
        def getchildren(self, graphic):
            '''返回列表里面的孩子'''
            return self.children
    
        def draw(self):
            print('======复合图形======')
            for i in self.children:
                print('所有的孩子们',i)
                i.draw()
            print('======end=========')
    
    pic1 = Picture()
    pic1.add(Point(2,3))
    pic1.add(Line(Point(1,2), Point(4,5)))
    pic1.add(Line(Point(0,1), Point(2,1)))
    
    pic2 = Picture()
    pic2.add(Point(-2,-1))
    pic2.add(Line(Point(0,0), Point(1,1)))
    
    pic = Picture()
    pic.add(pic1)
    pic.add(pic2)
    
    pic.draw()
    .draw这个函数对外表现一致,所有的都调用这个方法、
    
    递归对象的设计模式

    识别图中二维码,欢迎关注python宝典

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    转载声明:转载请注明出处,本技术博客是本人原创文章

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 递归对象的设计模式


     上一篇
    解释器模式 解释器模式
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 解释器模式1、内容 给定一种语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 解释器模式中会有终结符和非终结符之说,语法也
    2021-04-05
    下一篇 
    Python设计模式-装饰器模式 Python设计模式-装饰器模式
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 装饰器模式装饰器模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。 代码示例 #coding:utf-8 #
    2021-04-05