三、中介者模式(迪米特法則)
概念
模式動機(jī):
為了減少對象兩之間復(fù)雜的引用關(guān)系,使之成為一個松耦合的系統(tǒng),需要適用中介者模式
定義:
用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使耦合松散,而且可以獨(dú)立地該變它們之間的交互
中介者模式又稱為調(diào)停者模式,它是一種對象行為型模式
中介者模式的要點(diǎn)是將所有對象之間的交互細(xì)節(jié)抽象到一個獨(dú)立的類中,這個類叫做中介者類Mediator
類圖
代碼
中介者模式(Mediator Pattern)是一種軟件設(shè)計(jì)模式,它通過將對象之間的交互行為封裝在一個中介者對象中,來實(shí)現(xiàn)對象之間的解耦。中介者模式促進(jìn)了對象之間的松耦合,使其更易于維護(hù)和擴(kuò)展。
下面是一個簡單的中介者模式的代碼示例,以說明其工作原理:
class Mediator:
def __init__(self):
self.component1 = Component1(self)
self.component2 = Component2(self)
def notify(self, sender, event):
if event == 'event1':
self.component2.do_something()
elif event == 'event2':
self.component1.do_something()
class Component1:
def __init__(self, mediator):
self.mediator = mediator
def do_something(self):
# 處理自己的邏輯
print("Component 1 does something.")
# 觸發(fā)事件通知中介者
self.mediator.notify(self, 'event1')
class Component2:
def __init__(self, mediator):
self.mediator = mediator
def do_something(self):
# 處理自己的邏輯
print("Component 2 does something.")
# 觸發(fā)事件通知中介者
self.mediator.notify(self, 'event2')
# 創(chuàng)建中介者對象
mediator = Mediator()
# 執(zhí)行操作
component1 = Component1(mediator)
component2 = Component2(mediator)
component1.do_something()
在上述代碼示例中,我們有一個中介者類 Mediator
和兩個組件類 Component1
和 Component2
。中介者類擁有對這兩個組件的引用,并提供了一個 notify
方法用于接收事件通知并根據(jù)不同的事件執(zhí)行相應(yīng)的操作。
當(dāng)組件 Component1
執(zhí)行 do_something
方法時,它會觸發(fā)事件通知中介者,中介者根據(jù)事件類型調(diào)用 Component2
的相應(yīng)方法。同樣地,當(dāng)組件 Component2
執(zhí)行 do_something
方法時,它也會觸發(fā)事件通知中介者,中介者根據(jù)事件類型調(diào)用 Component1
的相應(yīng)方法。
這樣,組件之間的交互行為通過中介者對象進(jìn)行了封裝,組件之間的耦合度降低,它們只需要與中介者進(jìn)行通信,而不需要直接相互交互。這種解耦有助于增強(qiáng)代碼的可維護(hù)性和擴(kuò)展性。
中介者模式在現(xiàn)實(shí)世界中有許多應(yīng)用,比如聊天室、航空交通管制系統(tǒng)等,它們都使用中介者來協(xié)調(diào)不同對象之間的交互行為,從而實(shí)現(xiàn)更好的系統(tǒng)設(shè)計(jì)。
中介者承擔(dān)兩方面的職責(zé)
中轉(zhuǎn)作用(結(jié)構(gòu)性):
通過中介者提供的中轉(zhuǎn)作用,各個同事對象就不再需要顯式引用其他同事,當(dāng)需要和其他同事進(jìn)行通信時,通過中介者即可。
該中轉(zhuǎn)作用屬于中介者在結(jié)構(gòu)上的支持。
協(xié)調(diào)作用(行為性):
中介者可以更進(jìn)一步的對同事之間的關(guān)系進(jìn)行封裝,同事可以一致地和中介者進(jìn)行交互,而不需要指明中介者需要具體怎么做,中介者根據(jù)封裝在自身內(nèi)部的協(xié)調(diào)邏輯,對同事的請求進(jìn)行進(jìn)一步處理,將同事成員之間的關(guān)系行為進(jìn)行分離和封裝。
該協(xié)調(diào)作用屬于中介者在行為上的支持。
實(shí)例一:旅游項(xiàng)目信息共享軟件的設(shè)計(jì)
實(shí)例二:海島微型飛機(jī)場
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
缺點(diǎn):
在具體中介者類中包含了同事之間的交互細(xì)節(jié),可能會導(dǎo)致具體中介者類非常復(fù)雜,使得系統(tǒng)難以維護(hù)
適用場合
- 系統(tǒng)中對象之間存在復(fù)雜的引用關(guān)系,產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解。
- 一個對象由于引用了其他很多對象并且直接和這些對象通信,導(dǎo)致難以復(fù)用該對象。
- 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類??梢酝ㄟ^引入中介者類來實(shí)現(xiàn),在中介者中定義對象交互的公共行為,如果需要改變行為則可以增加新的中介者類
中介者模式與迪米特法則
在中介者模式中,通過創(chuàng)造出一個中介者對象,將系統(tǒng)中有關(guān)的對象所引用的其他對象數(shù)目減少到最少,使得一個對象與其同事之間的相互作用被這個對象與中介者對象之間的相互作用所取代。因此,中介者模式就是迪米特法則的一個典型應(yīng)用。
課程作業(yè)
文章來源:http://www.zghlxwxcb.cn/news/detail-533105.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-533105.html
到了這里,關(guān)于軟件設(shè)計(jì)模式與體系結(jié)構(gòu)-設(shè)計(jì)模式-行為型軟件設(shè)計(jì)模式-中介者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!