Python與設計模式 組合模式

2021-09-14 08:10:27 字數 4196 閱讀 1442

class company:

name = ''

def __init__(self, name):

self.name = name

def add(self, company):

pass

def remove(self, company):

pass

def display(self, depth):

pass

def listduty(self):

pass

class concretecompany(company):

childrencompany = none

def __init__(self, name):

company.__init__(self,name)

self.childrencompany =

def add(self, company):

def remove(self, company):

self.childrencompany.remove(company)

def display(self, depth):

print'-'*depth + self.name

for component in self.childrencompany:

component.display(depth+1)

def listduty(self):

for component in self.childrencompany:

component.listduty()

class hrdepartment(company):

def __init__(self, name):

company.__init__(self,name)

def display(self, depth):

print '-'*depth + self.name

def listduty(self): #履行職責

print '%s\t enrolling & transfering management.' % self.name

class financedepartment(company):

def __init__(self, name):

company.__init__(self,name)

def display(self, depth):

print "-" * depth + self.name

def listduty(self): #履行職責

print '%s\tfinance management.'%self.name

class rddepartment(company):

def __init__(self,name):

company.__init__(self,name)

def display(self, depth):

print "-"*depth+self.name

def listduty(self):

print "%s\tresearch & development."% self.name

在該例中,公司結構抽象僅考慮公司(concretecompany)和部門(department),公司有子公司的可能性,公司也有自己的部門,部門是最終的葉子結點。假設總公司下設東邊的分公司乙個,東邊的分公司下設東北公司和東南公司,顯示公司層級,並羅列這些的公司中各部門的職責,可以構建如下業務場景:

if __name__=="__main__":

root = concretecompany('headquarter')

root.add(hrdepartment('hq hr'))

root.add(financedepartment('hq finance'))

root.add(rddepartment("hq r&d"))

comp = concretecompany('east branch')

comp.add(hrdepartment('east.br hr'))

comp.add(financedepartment('east.br finance'))

comp.add(rddepartment("east.br r&d"))

root.add(comp)

comp1 = concretecompany('northast branch')

comp1.add(hrdepartment('northeast.br hr'))

comp1.add(financedepartment('northeast.br finance'))

comp1.add(rddepartment("northeast.br r&d"))

comp.add(comp1)

comp2 = concretecompany('southeast branch')

comp2.add(hrdepartment('southeast.br hr'))

comp2.add(financedepartment('southeast.br finance'))

comp2.add(rddepartment("southeast.br r&d"))

comp.add(comp2)

root.display(1)

root.listduty()

'''列印如下:

-headquarter

--hq hr

--hq finance

--hq r&d

--east branch

---east.br hr

---east.br finance

---east.br r&d

---northast branch

----northeast.br hr

----northeast.br finance

----northeast.br r&d

---southeast branch

----southeast.br hr

----southeast.br finance

----southeast.br r&d

hq hr enrolling & transfering management.

hq finance finance management.

hq r&d research & development.

east.br hr enrolling & transfering management.

east.br finance finance management.

east.br r&d research & development.

northeast.br hr enrolling & transfering management.

northeast.br finance finance management.

northeast.br r&d research & development.

southeast.br hr enrolling & transfering management.

southeast.br finance finance management.

southeast.br r&d research & development.

'''

組合模式也叫作部分-整體模式,其定義如下:將物件組合成樹形結構以表示「部分」和「整體」的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。

優點:1、節點增加和減少是非常自由和方便的,這也是樹形結構的一大特點;

2、所有節點,不管是分支節點還是葉子結點,不管是呼叫乙個結點,還是呼叫乙個結點群,都是非常方便的。

使用場景:

1、維護部分與整體的邏輯關係,或者動態呼叫整體或部分的功能介面,可以考慮使用組合模式。例如,非常多的作業系統(如linux)都把檔案系統設計成樹形結構,再比如說分布式應用中借助zookeeper,也可以組織和呼叫分布式集群中的結點功能。

1、由於葉子結點和分支結點直接使用了實現類,而不方便使用抽象類,這大大限制了介面的影響範圍;若結點介面發生變更,對系統造成的風險會比較大。

python設計模式 組合模式

學習版本3.5.2 組合模式的目的是將物件組合成樹形結構來表示 整體 部分 的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。舉個例子 用組合模式去做乙個簡單的資料夾系統 class basefile object def init self,name self.name name...

Python設計模式 組合模式

組合模式 將物件組合成樹形結構以表示 整體 部分 的層次關係。組合使得使用者對單個物件和復合物件的使用具有一致性。組合模式的關鍵的就是,元件和組合的整體具有乙個共同的基類。from abc import abcmeta,abstractmethod class comptercompoent met...

組合模式 設計模式 組合模式

1.需求分析 假設要給乙個大公司做辦公管理系統,公司有人力資源部 財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部 財務部等,要求總公司 分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式 組合模式。2.定義 將物件組合...