• 设计模式之组合模式


    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()
  • 相关阅读:
    Why to define my own blog skin
    安装drupal7.7
    同步和异步的区别
    神马是云计算神马是物联网
    zen主题安装图文记录
    《那些年啊,那些事——一个程序员的奋斗史》——127
    《一个程序员的奋斗史》帮我选封面哇! —— 猜封面页数赢赠书活动~
    《那些年啊,那些事——一个程序员的奋斗史》——126
    《那些年啊,那些事——一个程序员的奋斗史》——128 (终章)
    伍定轩乱语
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12969787.html
Copyright © 2020-2023  润新知