from abc importabcmeta, 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控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...
設計模式之組合模式
組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...