什么是组合模式
将对象组合成树形结构以表示“整体-部分”的层次结构关系。组合使得用户对单个对象和复合对象的使用具有一致性。
模拟代码
class ComputerComponent:"""组件,所有自组件的基类"""def __init__(self, name):self._name = namedef show_info(self, indent=''):passdef is_computer(self):return Falsedef 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 Truedef 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 = namedef get_name(self):return self._namedef is_composite(self):return Falsedef feature(self, indent):# indent 仅用于内容的缩进passclass 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 Truedef 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()方法。
