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

    一、内容

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

    二、角色

    • 抽象组件
    • 叶子组件
    • 复合组件
    • 客户端

    三、优点

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

    四、缺点

    • 很难限制组合中的组件

    五、适用场景

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

    六、代码示例

    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这个函数对外表现一致,所有的都调用这个方法、

    
    
  • 相关阅读:
    个人介绍
    对软件工程课程的希望
    对这门课程的的希望和目标
    关于sql server profiler 监控工具的使用
    关于eclipse常用的一些快捷键
    后台页面中发现的一点问题总结
    电脑端手机模拟器软件
    关于.net后台的异步刷新的问题
    Excle中的使用小技巧
    关于.net里面的静态html页面和接口组合使用的网站
  • 原文地址:https://www.cnblogs.com/morgana/p/8496325.html
Copyright © 2011-2022 走看看