Python設(shè)計(jì)模式 - 中介者模式

"""

中介者模式:用一個(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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容