Mediator的意思是中介者、調(diào)節(jié)者、傳遞物,顧名思義,這個(gè)模式在程式中必然負(fù)擔(dān)一個(gè)中介、調(diào)節(jié)、傳遞的工作。
物件導(dǎo)向設(shè)計(jì)中,每個(gè)物件所負(fù)擔(dān)的工作儘可能的簡(jiǎn)單明瞭,鼓勵(lì)物件將工作分布至其它物件上,讓一群工作屬性相同的物件得以共同合作,即所謂高聚合性,以增加物件的可重用性。
然而在組織物件工作的同時(shí),物件彼此之間可能知道彼此的存在,並相互依賴(lài),這就使得物件之間的耦合性相對(duì)的提高,最差的情況下,所有的物件都知道彼此的存在,這又會(huì)使得系統(tǒng)的重用性降低。
Mediator模式用一個(gè)中介的物件來(lái)封裝物件彼此之間的交互,物件之間並不用互相知道另一方,這可以降低物件之間的耦合性,如果要改變物件之間的交互行為,也只需要對(duì)Mediator加以修改即可。
在
Gof 的書(shū) 中所舉的例子為對(duì)話方塊組件;例如,當(dāng)一個(gè)特定的輸入欄為空時(shí),另一個(gè)按鈕不能使用;在ListBox的選項(xiàng)中選擇一個(gè)項(xiàng)目,將會(huì)改變另一個(gè)欄位的內(nèi)容;反過(guò)來(lái)的,輸入欄位的內(nèi)容也會(huì)影響ListBox的選擇等等。
在這個(gè)例子中,可以設(shè)計(jì)對(duì)話方塊中的組件知道彼此的存在,由一個(gè)直接影響另一個(gè)(或多個(gè))組件,但最好的方法,還是設(shè)計(jì)一個(gè)Mediator,由它來(lái)協(xié)調(diào)組件之間的交互,例如設(shè)計(jì)一個(gè)FontDialogDirector類(lèi)別來(lái)作為中介者。
可以從Sequence Diagram來(lái)瞭解Mediator的運(yùn)作:
當(dāng)ListBox發(fā)生變化時(shí),它會(huì)呼叫Mediator的listBoxChanged()方法,Mediator取得變化的組件之狀態(tài),並重新設(shè)定所有與它有交互的組件,同樣的,其它的組件發(fā)生變化時(shí),也呼叫Mediator上對(duì)應(yīng)的方法,由Mediator來(lái)取得組件變化,並設(shè)定其它互動(dòng)的組件。
簡(jiǎn)單的說(shuō),Mediator設(shè)計(jì)有與組件溝通的介面,介面中封裝了與其它組件互動(dòng)細(xì)節(jié),組件與組件之間不用知道彼此的存在,它們只要與Mediator溝通就好了,利用這種方式,可以切開(kāi)組件與組件之間的耦合。
Mediator模式的 UML 結(jié)構(gòu)圖如下所示:
基本上Mediator模式在使用的彈性很大,由Sequence Diagram理解概念,會(huì)比從Class Diagram瞭解結(jié)構(gòu)來(lái)得重要,不過(guò)在Class Diagram中可以注意的是類(lèi)別的名稱(chēng),Colleague是同事的意思,將一群共事的元件視為一群共同合作的同事,為了使同事之間的活動(dòng)獨(dú)立,並使得團(tuán)隊(duì)合作的交互更具彈性,需要一個(gè)Mediator來(lái)協(xié)調(diào)同事之間的業(yè)務(wù)行為。