内容:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 角色: 抽象组建(component) 叶子组建(Leaf) 复合组建(Composite) 客户端 (Client) UML 图 举个例子 需求:需要创建一个图形,由点,线组成,然后将两个点线组合图再组合成一个新的图形。
from abc import ABCMeta, abstractmethod
class Graphic ( metaclass= ABCMeta) : @abstractmethod def draw ( self) : pass
class Point ( Graphic) : def __init__ ( self, x, y) : self. x = xself. y = ydef __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 = p1self. p2 = p2def __str__ ( self) : return "线段[%s,%s]" % ( self. p1, self. p2) def draw ( self) : print ( str ( self) )
class Picture ( Graphic) : def __init__ ( self, iterable) : self. children = [ ] for g in iterable: self. add( g) def add ( self, graphic) : self. children. append( graphic) def draw ( self) : print ( "----------复合图形----------" ) for g in self. children: g. draw( ) print ( "----------复合图形----------" ) p1 = Point( 2 , 3 )
l1 = Line( Point( 3 , 4 ) , Point( 6 , 7 ) )
l2 = Line( Point( 1 , 5 ) , Point( 2 , 8 ) )
pic1 = Picture( [ p1, l1, l2] ) p2 = Point( 4 , 2 )
l3 = Line( Point( 1 , 4 ) , Point( 2 , 5 ) )
l4 = Line( Point( 3 , 5 ) , Point( 1 , 8 ) )
pic2 = Picture( [ p2, l3, l4] ) pic= Picture( [ pic1, pic2] )
pic. draw( )
适用场景: 表示对象的“部分-整体”层次结构(特别是结构是递归的) 希望用户忽略组合对对象与单个对象的不同,用户统一地使用组合结构中的所有对象 优点: 定义了包含基本对象和组合对象的类层次结构 简化客户端代码,即客户端可以一致地使用组合对象和单个对象 更容易增加新类型的组件