我想学会设计模式之组合模式

87 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

我想学会设计模式之组合模式

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。

什么是“组合模式”?

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。

  1. 用小的子对象构造更大的父对象,而这些子对象也由更小的子对象构成
  2. 单个对象和组合对象对于用户暴露的接口具有一致性,而同种接口不同表现形式亦体现了多态性

应用场景

组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如

  • 扫描文件夹
  • 渲染网站导航结构等等。

代码实现

这里用代码模拟文件扫描功能,封装了FileFolder两个类。在组合模式下,用户可以向Folder类嵌套File或者Folder来模拟真实的“文件目录”的树结构。

同时,两个类都对外提供了scan接口,File下的scan是扫描文件,Folder下的scan是调用子文件夹和子文件的scan方法。整个过程采用的是深度优先

python3 实现

class File:  # 文件类
    def __init__(self, name):
        self.name = name
    def add(self):
        raise NotImplementedError()
    def scan(self):
        print('扫描文件:' + self.name)
class Folder:  # 文件夹类
    def __init__(self, name):
        self.name = name
        self.files = []
    def add(self, file):
        self.files.append(file)
    def scan(self):
        print('扫描文件夹: ' + self.name)
        for item in self.files:
            item.scan()
if __name__ == '__main__':
    home = Folder("用户根目录")
    folder1 = Folder("第一个文件夹")
    folder2 = Folder("第二个文件夹")
    file1 = File("1号文件")
    file2 = File("2号文件")
    file3 = File("3号文件")
    # 将文件添加到对应文件夹中
    folder1.add(file1)
    folder2.add(file2)
    folder2.add(file3)
    # 将文件夹添加到更高级的目录文件夹中
    home.add(folder1)
    home.add(folder2)
    # 扫描目录文件夹
    home.scan()

执行$ python main.py, 最终输出结果是:

扫描文件夹: 用户根目录
扫描文件夹: 第一个文件夹
扫描文件:1号文件
扫描文件夹: 第二个文件夹
扫描文件:2号文件
扫描文件:3号文件