什么是组合模式

将对象组合成树形结构以表示“整体-部分”的层次结构关系。组合使得用户对单个对象和复合对象的使用具有一致性。

模拟代码

  1. class ComputerComponent:
  2. """组件,所有自组件的基类"""
  3. def __init__(self, name):
  4. self._name = name
  5. def show_info(self, indent=''):
  6. pass
  7. def is_computer(self):
  8. return False
  9. def startup(self, indent=''):
  10. print('%s%s 准备开始工作。。。' % (indent, self._name))
  11. def shutdown(self, indent=''):
  12. print('%s%s 即将结束工作。。。' % (indent, self._name))
  13. class CPU(ComputerComponent):
  14. """中央处理器"""
  15. def __init__(self, name):
  16. super().__init__(name=name)
  17. def show_info(self, indent=''):
  18. print("%sCPU:%s, 可以进行高速运算。" % (indent, self._name))
  19. class MemoryCard(ComputerComponent):
  20. """内存条"""
  21. def __init__(self, name):
  22. super().__init__(name=name)
  23. def show_info(self, indent=''):
  24. print("%s内存:%s, 可以缓存数据,读写速度快。" % (indent, self._name))
  25. class HardDisk(ComputerComponent):
  26. """硬盘"""
  27. def __init__(self, name):
  28. super().__init__(name=name)
  29. def show_info(self, indent=''):
  30. print("%s硬盘:%s, 可以永久存储数据。" % (indent, self._name))
  31. class GraphicsCard(ComputerComponent):
  32. """显卡"""
  33. def __init__(self, name):
  34. super().__init__(name=name)
  35. def show_info(self, indent=''):
  36. print("%s显卡:%s, 可以高速处理图像数据。" % (indent, self._name))
  37. class Battery(ComputerComponent):
  38. """电源"""
  39. def __init__(self, name):
  40. super().__init__(name=name)
  41. def show_info(self, indent=''):
  42. print("%s电源:%s, 可以给主板供电。" % (indent, self._name))
  43. class Fan(ComputerComponent):
  44. """风扇"""
  45. def __init__(self, name):
  46. super().__init__(name=name)
  47. def show_info(self, indent=''):
  48. print("%s风扇:%s, 辅助CPU散热。" % (indent, self._name))
  49. class Displayer(ComputerComponent):
  50. def __init__(self, name):
  51. super().__init__(name=name)
  52. def show_info(self, indent=''):
  53. print("%s显示器:%s, 负责内容显示。" % (indent, self._name))
  54. class ComputerComposite(ComputerComponent):
  55. """配件组合"""
  56. def __init__(self, name):
  57. super().__init__(name)
  58. self._components = []
  59. def show_info(self, indent=''):
  60. print('%s由以下部件组成:' % (self._name, ))
  61. indent += '\t'
  62. for element in self._components:
  63. element.show_info(indent)
  64. def is_computer(self):
  65. return True
  66. def add_component(self, component):
  67. self._components.append(component)
  68. def remove_component(self, component):
  69. self._components.remove(component)
  70. def startup(self, indent=''):
  71. super().startup(indent)
  72. indent += '\t'
  73. for element in self._components:
  74. element.startup(indent)
  75. def shutdown(self, indent=''):
  76. super().shutdown(indent)
  77. indent += '\t'
  78. for element in self._components:
  79. element.shutdown(indent)
  80. class Mainboard(ComputerComposite):
  81. """主板"""
  82. def __init__(self, name):
  83. super().__init__(name)
  84. def show_info(self, indent=''):
  85. print(indent + '主板:', end='')
  86. super().show_info(indent)
  87. class ComputerCase(ComputerComposite):
  88. """机箱"""
  89. def __init__(self, name):
  90. super().__init__(name)
  91. def show_info(self, indent=''):
  92. print(indent + '机箱:', end='')
  93. super().show_info(indent)
  94. class Computer(ComputerComposite):
  95. """电脑"""
  96. def __init__(self, name):
  97. super().__init__(name)
  98. def show_info(self, indent=''):
  99. print(indent + '电脑:', end='')
  100. super().show_info(indent)
  101. def test_computer():
  102. main_board = Mainboard("GIGABYTE Z170M M_ATX")
  103. main_board.add_component(CPU("Inter Core i5-6600k"))
  104. main_board.add_component(MemoryCard("Kingston Fury DDR4"))
  105. main_board.add_component(HardDisk("Kingston V300"))
  106. main_board.add_component(GraphicsCard("Colorful iGame750"))
  107. computer_case = ComputerCase("SAMA MATX")
  108. computer_case.add_component(main_board)
  109. computer_case.add_component(Battery("Antec VP 450P"))
  110. computer_case.add_component(Fan("DEEPCOOL 120L"))
  111. computer = Computer("Tony DIY 电脑")
  112. computer.add_component(computer_case)
  113. computer.add_component(Displayer("AOC LV243XIP"))
  114. computer.show_info('')
  115. print('\n开机过程:')
  116. computer.startup('')
  117. print('\n 关机过程:')
  118. computer.shutdown('')
  119. if __name__ == '__main__':
  120. test_computer()

组合模式的设计思想

组装的电脑有明显的部分与整体的关系,主板、电源等是电脑的一部分,而主板上又有CPU、硬盘、显卡,它们又是主板的部分。像电脑一样,把对象组合成树形结构,以表示“部分-整体”的层次结构的程序设计模式就叫组合模式

代码框架

  1. class Component:
  2. """组件"""
  3. def __init__(self, name):
  4. self._name = name
  5. def get_name(self):
  6. return self._name
  7. def is_composite(self):
  8. return False
  9. def feature(self, indent):
  10. # indent 仅用于内容的缩进
  11. pass
  12. class Composite(Component):
  13. """复合组件"""
  14. def __init__(self, name):
  15. super().__init__(name)
  16. self._compoents = []
  17. def add_component(self, component):
  18. self._compoents.append(component)
  19. def remove_component(self, component):
  20. self._compoents.append(component)
  21. def is_composite(self):
  22. return True
  23. def feature(self, indent):
  24. indent += '\t'
  25. for element in self._compoents:
  26. print(indent, end='')
  27. element.feature(indent)

模型说明

Component是组件的基类,定义统一的方法feature()和is_composite(),is_composite用于判断组件是否为复合组件,ComponentA、ComponentB为具体组件,Composite就是复合组件(也就是组合对象),复合组件可以添加或删除组件。复合组件本身也是个组件,因此组合对象可以像一般对象一样被使用,因为它也实现Component的feature()方法。

实战

应用场景