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

    
    
  • 相关阅读:
    超几何分布
    区分概率中的事件关系
    破解概率求解的策略
    j2ee的十三种技术
    jsp第1讲(上集)
    servlet第3讲(中集)----同一用户的不同页面共享数据
    servlet第3讲(上集)----同一用户的不同页面共享数据
    servlet第2讲(下集)----通过HttpServlet实现一个用户登录网站(继承HttpServlet)
    一款基于的jQuery仿苹果样式焦点图插件
    一款基于css3的散子3D翻转特效
  • 原文地址:https://www.cnblogs.com/morgana/p/8496325.html
Copyright © 2011-2022 走看看