"""
中介者模式:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,
而且可以獨(dú)立地改變它們之間的交互。
一般應(yīng)用于一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信的場(chǎng)合。
優(yōu)點(diǎn):降低了各個(gè)模塊的耦合性。
缺點(diǎn):中介對(duì)象容易變得復(fù)雜和龐大。
"""
#?-*-?coding:?utf-8?-*-
import?random
import?time
class?TC:
????def?__init__(self):
????????self._tm?=?None
????????self._bProblem?=?0
????def?setup(self):
????????print("設(shè)置測(cè)試")
????????time.sleep(0.1)
????????self._tm.prepareReporting()
????def?execute(self):
????????if?not?self._bProblem:
????????????print("執(zhí)行測(cè)試")
????????????time.sleep(0.1)
????????else:
????????????print("問(wèn)題設(shè)置。測(cè)試不執(zhí)行。")
????def?tearDown(self):
????????if?not?self._bProblem:
????????????print("拆除")
????????????time.sleep(0.1)
????????????self._tm.publishReport()
????????else:
????????????print("測(cè)試不執(zhí)行。沒(méi)有拆除需要")
????def?setTM(self,?tm):
????????self._tm?=?tm
????def?setProblem(self,?value):
????????self._bProblem?=?value
class?Reporter:
????def?__init__(self):
????????self._tm?=?None
????def?prepare(self):
????????print("報(bào)表類(lèi)正準(zhǔn)備報(bào)告結(jié)果")
????????time.sleep(0.1)
????def?report(self):
????????print("報(bào)告測(cè)試的結(jié)果")
????????time.sleep(0.1)
????def?setTM(self,?tm):
????????self._tm?=?tm
class?DB:
????def?__init__(self):
????????self._tm?=?None
????def?insert(self):
????????print("增加執(zhí)行開(kāi)始狀態(tài)在數(shù)據(jù)庫(kù)")
????????time.sleep(0.1)
????????#?下面的代碼是模擬從DB到TC通信
????????if?random.randrange(1,?4)?==?3:
????????????return?-1
????def?update(self):
????????print("更新數(shù)據(jù)庫(kù)中的測(cè)試結(jié)果")
????????time.sleep(0.1)
????def?setTM(self,?tm):
????????self._tm?=?tm
class?TestManager:
????def?__init__(self):
????????self._reporter?=?None
????????self._db?=?None
????????self._tc?=?None
????def?prepareReporting(self):
????????rvalue?=?self._db.insert()
????????if?rvalue?==?-1:
????????????self._tc.setProblem(1)
????????????self._reporter.prepare()
????def?setReporter(self,?reporter):
????????self._reporter?=?reporter
????def?setDB(self,?db):
????????self._db?=?db
????def?publishReport(self):
????????self._db.update()
????????self._reporter.report()
????def?setTC(self,?tc):
????????self._tc?=?tc
if?__name__?==?'__main__':
????reporter?=?Reporter()
????db?=?DB()
????tm?=?TestManager()
????tm.setReporter(reporter)
????tm.setDB(db)
????reporter.setTM(tm)
????db.setTM(tm)
????#為了簡(jiǎn)化,我們?cè)谙嗤臏y(cè)試循環(huán)。
????#實(shí)際上,它可能是有關(guān)各種獨(dú)特的測(cè)試類(lèi)和它們的對(duì)象
????for?i?in?range(3):
????????tc?=?TC()
????????tc.setTM(tm)
????????tm.setTC(tc)
????????tc.setup()
????????tc.execute()
????????tc.tearDown()