設計模式之組合模式

2022-05-12 04:07:19 字數 2754 閱讀 2629

from abc import

abcmeta, abstractmethod

importos#

整體與部分的關係或者是層次性比較明顯的關係

class component(metaclass=abcmeta):

"""元件

"""def

__init__

(self, name):

self._name =name

defgetname(self):

return

self._name

defiscomposite(self):

return

false

@abstractmethod

deffeature(self, indent):

#indent 僅用於內容輸出時的縮排

pass

class

composite(component):

"""復合元件

"""def

__init__

(self, name):

super().

__init__

(name)

self._components =

defaddcomponent(self, component):

defremovecomponent(self, component):

self._components.remove(component)

defiscomposite(self):

return

true

deffeature(self, indent):

indent += "\t"

for component in

self._components:

component.feature(indent)

class

filedetail(component):

"""檔案詳情

"""def

__init__

(self, name):

super().

__init__

(name)

self._size =0

defsetsize(self, size):

self._size =size

defgetsize(self):

return

self._size

deffeature(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

defsetcount(self, filenum):

self._count =filenum

defgetcount(self):

return

self._count

deffeature(self, indent):

print("

資料夾名:%s, 檔案數量:%d。包含的檔案:

" %(self._name, self._count))

super().feature(indent)

defscandir(rootpath, folderdetail):

ifnot

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)

ifos.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)

deftestdir():

folder = folderdetail("

sdk"

) scandir(r""

, folder)

folder.feature("")

if__name__ == "

__main__":

testdir()

設計模式之組合模式

組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...

設計模式之 組合模式

有時候我們需要維護一些物件,這些物件具有一定的層次結構,它們之間雖然差異很大,但在使用的時候我們希望能構一致的對待,比如windows控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...

設計模式之組合模式

組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...