設計模式之十 組合模式

2021-10-07 07:10:36 字數 3260 閱讀 4220

組合模式:將物件組合成熟型結構一表示『部分-整體』的層次結構。組合模式使得使用者對單個物件的組合物件的使用具有一致性。具體來講就是,樹根和樹枝和樹葉都是統一對待的。樹枝和樹葉繼承於樹根。

什麼時候用組合模式?

當需求中是體現部分與整體的層次結構式,以及你希望使用者可以忽略組合物件與單個物件的不同,統一使用組合結構中的所有物件時,就應該考慮用組合模式。好了,上**。

from abc import abcmeta, abstractmethod

class

company

(metaclass=abcmeta)

:def

__init__

(self, name)

: self.name = name

@abstractmethod

defadd(self, company)

:pass

@abstractmethod

defremove

(self, company)

:pass

@abstractmethod

defdisplay

(self, depth)

:pass

@abstractmethod

defline_of_duty

(self)

:pass

class

concretecompany

(company)

:def

__init__

(self, name)

:super()

.__init__(name)

self.children =

defadd

(self, company)

:def

remove

(self, company)

: self.children.remove(company)

defdisplay

(self, depth)

:print

('-'

*depth +

"company "

.format

(self.name)

)for company in self.children:

company.display(depth +2)

defline_of_duty

(self)

:for company in self.children:

company.line_of_duty(

)class

hrdepartment

(company)

:def

__init__

(self, name)

:super()

.__init__(name)

defadd

(self, company)

:pass

defremove

(self, company)

:pass

defdisplay

(self, depth)

:print

('-'

*depth + self.name)

defline_of_duty

(self)

:print

(" this department is responsible for recruiting employees"

.format

(self.name)

)class

financedepartment

(company)

:def

__init__

(self, name)

:super()

.__init__(name)

defadd

(self, company)

:pass

defremove

(self, company)

:pass

defdisplay

(self, depth)

:print

('-'

*depth + self.name)

defline_of_duty

(self)

:print

(" this department is responsible for managing the money"

.format

(self.name)

)if __name__ ==

"__main__"

: headquarter = concretecompany(

"headquarter"

) headquarter.add(hrdepartment(

"root hr"))

headquarter.add(financedepartment(

"root finance"))

south_subsidy = concretecompany(

"southsubsidy"

) south_subsidy.add(hrdepartment(

"southsubsidy hr department"))

south_subsidy.add(financedepartment(

"southsubsidy finance department"))

headquarter.add(south_subsidy)

north_subsidy = concretecompany(

"northsubsidy"

) north_subsidy.add(hrdepartment(

"northsubsidy hr department"))

north_subsidy.add(financedepartment(

"northsubsidy finance department"))

headquarter.add(north_subsidy)

headquarter.display(1)

headquarter.line_of_duty(

)

這段**中,優點浪費的是,具體的部門類,也就是樹葉,裡邊為了統一性會有一部分的**沒有實現。也可以把這些去掉。在comany類中不寫這兩個介面,只在concretecompany 類中實現add remove等操作,但是這樣在使用這些類的時候, 由於樹葉和樹枝介面不同,就需要有一些判斷。

設計模式詳解(十) 組合模式

設計出省 市 區機構的區域程式 省市區結構如下 安徽省 合肥市 肥東縣 蕪湖市 三山區 浙江省 杭州市 濱江區 溫州市 永嘉縣 江蘇省 鎮江市 京口區 定義省市區 縣三個類,省包含市,市包含區 縣。客戶端測試 public static void main string args 輸出 安徽省 合肥...

設計模式8 組合模式

組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...

《設計模式12 組合模式

組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...