什么是组合模式
将对象组合成树形结构以表示“整体-部分”的层次结构关系。组合使得用户对单个对象和复合对象的使用具有一致性。
模拟代码
class ComputerComponent:
"""组件,所有自组件的基类"""
def __init__(self, name):
self._name = name
def show_info(self, indent=''):
pass
def is_computer(self):
return False
def startup(self, indent=''):
print('%s%s 准备开始工作。。。' % (indent, self._name))
def shutdown(self, indent=''):
print('%s%s 即将结束工作。。。' % (indent, self._name))
class CPU(ComputerComponent):
"""中央处理器"""
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%sCPU:%s, 可以进行高速运算。" % (indent, self._name))
class MemoryCard(ComputerComponent):
"""内存条"""
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%s内存:%s, 可以缓存数据,读写速度快。" % (indent, self._name))
class HardDisk(ComputerComponent):
"""硬盘"""
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%s硬盘:%s, 可以永久存储数据。" % (indent, self._name))
class GraphicsCard(ComputerComponent):
"""显卡"""
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%s显卡:%s, 可以高速处理图像数据。" % (indent, self._name))
class Battery(ComputerComponent):
"""电源"""
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%s电源:%s, 可以给主板供电。" % (indent, self._name))
class Fan(ComputerComponent):
"""风扇"""
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%s风扇:%s, 辅助CPU散热。" % (indent, self._name))
class Displayer(ComputerComponent):
def __init__(self, name):
super().__init__(name=name)
def show_info(self, indent=''):
print("%s显示器:%s, 负责内容显示。" % (indent, self._name))
class ComputerComposite(ComputerComponent):
"""配件组合"""
def __init__(self, name):
super().__init__(name)
self._components = []
def show_info(self, indent=''):
print('%s由以下部件组成:' % (self._name, ))
indent += '\t'
for element in self._components:
element.show_info(indent)
def is_computer(self):
return True
def add_component(self, component):
self._components.append(component)
def remove_component(self, component):
self._components.remove(component)
def startup(self, indent=''):
super().startup(indent)
indent += '\t'
for element in self._components:
element.startup(indent)
def shutdown(self, indent=''):
super().shutdown(indent)
indent += '\t'
for element in self._components:
element.shutdown(indent)
class Mainboard(ComputerComposite):
"""主板"""
def __init__(self, name):
super().__init__(name)
def show_info(self, indent=''):
print(indent + '主板:', end='')
super().show_info(indent)
class ComputerCase(ComputerComposite):
"""机箱"""
def __init__(self, name):
super().__init__(name)
def show_info(self, indent=''):
print(indent + '机箱:', end='')
super().show_info(indent)
class Computer(ComputerComposite):
"""电脑"""
def __init__(self, name):
super().__init__(name)
def show_info(self, indent=''):
print(indent + '电脑:', end='')
super().show_info(indent)
def test_computer():
main_board = Mainboard("GIGABYTE Z170M M_ATX")
main_board.add_component(CPU("Inter Core i5-6600k"))
main_board.add_component(MemoryCard("Kingston Fury DDR4"))
main_board.add_component(HardDisk("Kingston V300"))
main_board.add_component(GraphicsCard("Colorful iGame750"))
computer_case = ComputerCase("SAMA MATX")
computer_case.add_component(main_board)
computer_case.add_component(Battery("Antec VP 450P"))
computer_case.add_component(Fan("DEEPCOOL 120L"))
computer = Computer("Tony DIY 电脑")
computer.add_component(computer_case)
computer.add_component(Displayer("AOC LV243XIP"))
computer.show_info('')
print('\n开机过程:')
computer.startup('')
print('\n 关机过程:')
computer.shutdown('')
if __name__ == '__main__':
test_computer()
组合模式的设计思想
组装的电脑有明显的部分与整体的关系,主板、电源等是电脑的一部分,而主板上又有CPU、硬盘、显卡,它们又是主板的部分。像电脑一样,把对象组合成树形结构,以表示“部分-整体”的层次结构的程序设计模式就叫组合模式
代码框架
class Component:
"""组件"""
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
def is_composite(self):
return False
def feature(self, indent):
# indent 仅用于内容的缩进
pass
class Composite(Component):
"""复合组件"""
def __init__(self, name):
super().__init__(name)
self._compoents = []
def add_component(self, component):
self._compoents.append(component)
def remove_component(self, component):
self._compoents.append(component)
def is_composite(self):
return True
def feature(self, indent):
indent += '\t'
for element in self._compoents:
print(indent, end='')
element.feature(indent)
模型说明
Component是组件的基类,定义统一的方法feature()和is_composite(),is_composite用于判断组件是否为复合组件,ComponentA、ComponentB为具体组件,Composite就是复合组件(也就是组合对象),复合组件可以添加或删除组件。复合组件本身也是个组件,因此组合对象可以像一般对象一样被使用,因为它也实现Component的feature()方法。