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()
  • 相关阅读:
    JSP中getParameter和getAttribute区别
    用jsp实现省市区三级联动下拉
    SQL
    Unity3d笔试题大全
    FPSCalc——简单FPS观测类
    GameObjectPool——Unity中的对象池
    MonoSingleton——Unity中的单例模式
    用非递归、不用栈的方法,实现原位(in-place)的快速排序
    一道有序洗牌的笔试题,阿里UC等都用过
    MFC中显示图像的放大、缩小、移动功能
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12969787.html
Copyright © 2011-2022 走看看