zoukankan      html  css  js  c++  java
  • 设计模式之组合模式

    from abc import ABCMeta, abstractmethod
    import os
    
    
    # 整体与部分的关系或者是层次性比较明显的关系
    class Component(metaclass=ABCMeta):
        """组件"""
        def __init__(self, name):
            self._name = name
    
        def getName(self):
            return self._name
    
        def isComposite(self):
            return False
        
        @abstractmethod
        def feature(self, indent):
            # indent 仅用于内容输出时的缩进
            pass
    
    
    class Composite(Component):
        """复合组件"""
        def __init__(self, name):
            super().__init__(name)
            self._components = []
    
        def addComponent(self, component):
            self._components.append(component)
    
        def removeComponent(self, component):
            self._components.remove(component)
    
        def isComposite(self):
            return True
    
        def feature(self, indent):
            indent += "	"
            for component in self._components:
                component.feature(indent)
    
    
    class FileDetail(Component):
        """文件详情"""
        def __init__(self, name):
            super().__init__(name)
            self._size = 0
    
        def setSize(self, size):
            self._size = size
    
        def getSize(self):
            return self._size
    
        def feature(self, indent):
            fileSize = round(self._size / float(1024), 2)
            print("文件名称:%s, 文件大小:%sKB" % (self._name, fileSize))
    
    
    class FolderDetail(Composite):
        def __init__(self, name):
            super().__init__(name)
            self._count = 0
    
        def setCount(self, fileNum):
            self._count = fileNum
    
        def getCount(self):
            return self._count
    
        def feature(self, indent):
            print("文件夹名:%s, 文件数量:%d。包含的文件:" % (self._name, self._count))
            super().feature(indent)
    
    
    def scanDir(rootPath, folderDetail):
        if not os.path.isdir(rootPath):
            raise ValueError("rootPath不是有效的路径:%s" % rootPath)
        if folderDetail is None:
            raise ValueError("folderDetail不能为空")
        fileNames = os.listdir(rootPath)
        for fileName in fileNames:
            filePath = os.path.join(rootPath, fileName)
            if os.path.isdir(filePath):
                folder = FolderDetail(fileName)
                scanDir(filePath, folder)
                folderDetail.addComponent(folder)
            else:
                fileDetail = FileDetail(fileName)
                fileDetail.setSize(os.path.getsize(filePath))
                folderDetail.addComponent(fileDetail)
                folderDetail.setCount(folderDetail.getCount()+1)
    
    
    def testDir():
        folder = FolderDetail("sdk")
        scanDir(r"D:TencentQQQQFile1806521378FileRecvday32-后台视频管理
    ode_modules@baiducloudsdk", folder)
        folder.feature("")
    
    
    if __name__ == "__main__":
        testDir()
  • 相关阅读:
    二叉树的遍历以及创建——by leona
    利用图像压缩模型抵御对抗样本 by ch
    卡尔曼滤波器及其扩展的个人学习笔记~
    用GAN进行图像压缩 by ch
    用深度学习进行图像压缩 by ch
    3D目标检测&6D姿态估计之SSD-6D算法--by leona
    如何搭建三维重建工程体系
    C++面对对象(一)
    Pybind11教程
    C++的debug和release区别
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12969787.html
Copyright © 2011-2022 走看看