组合模式
概述
将对象组合成树形结构 以表示“部分和整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
对象
抽象组件(Component) 叶子组件(Leaf) 复合组件(Composite) 客户端(Client)
适用场景
表示对象的“部分与整体”层次结构 希望用户忽略组合对象与单个对象的不同,用户统一的使用组合结构中的所有对象
例子
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 f"Point({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 f"Line[{self.p1}, {self.p2}]"
def draw ( self) :
print ( str ( self) )
class Picture ( Graphic) :
def __init__ ( self, iterable) :
self. children = [ ]
for i in iterable:
self. add( i)
def add ( self, grophic) :
self. children. append( grophic)
def draw ( self) :
print ( "---复合图形---" )
for i in self. children:
i. draw( )
print ( "---复合图形---" )
print ( "-----------pic1-------------------" )
p1 = Point( 2 , 3 )
l1 = Line( Point( 3 , 4 ) , Point( 6 , 7 ) )
l2 = Line( Point( 3 , 5 ) , Point( 6 , 8 ) )
pic1 = Picture( [ p1, l1, l2] )
pic1. draw( )
print ( "-----------pic2-------------------" )
p2 = Point( 3 , 3 )
l3 = Line( Point( 4 , 4 ) , Point( 7 , 7 ) )
l4 = Line( Point( 5 , 5 ) , Point( 8 , 8 ) )
pic2 = Picture( [ p2, l3, l4] )
pic2. draw( )
print ( "-----------pic-------------------" )
pic = Picture( [ pic1, pic2] )
pic. draw( )
优点
定义了包含基本对象和组合对象的层次结构 简化了客户端代码,客户端可以一致的使用组合对象和单个对象 更容易增加新类型组件