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.定義 將物件組合...