1.1概述 用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。這就是中介者模式的定義。 一個對象含有另一個對象的引用是面向對象中經常使用的方式,也是面向對象所提倡的,即少用繼承多用組合。但是怎樣合理地組合對象對系統今後的擴展 ...
1.1概述
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。這就是中介者模式的定義。
一個對象含有另一個對象的引用是面向對象中經常使用的方式,也是面向對象所提倡的,即少用繼承多用組合。但是怎樣合理地組合對象對系統今後的擴展、維護和對象的復用是至關重要的,這也正是學習設計模式的重要原因。
例如,在一個房屋租賃系統中,有很多對象,有些對象是求租者,有些是出租者,如果要求他們之間必須成為朋友才能進行有關租賃的操作,顯然不利於系統的維護和發展,因此,每當有新的出租者或求租者加入該系統,這個新的加入者必須和現有系統中的所有人互為朋友後才能和他們進行有關租賃的操作,這就意味著要修改大量的代碼,這對系統的維護是非常不利的也是無法容忍的。一個好的解決辦法就是在房屋租賃系統中建立一個稱作中介者的對象,中介者包含系統中所有其他對象的引用,而系統中的其他對象只包含中介者的引用,也就是說中介者和大家互為朋友、中介者使系統中的其他對象完全解耦,當系統中某個對象需要和系統中另外一個對象交互時,只需將自己的請求通知中介者即可,如果有新的加入者,該加入者只需含有中介者的引用,並讓中介者含有自己的引用,他就可以和系統中其他對象進行有關租賃操作,具體如下圖一所示:
圖一:中介者、出租者和求租者
中介者模式是封裝一系列的對象交互的成熟模式,其關鍵是將對象之間的交互封裝在稱作中介者的對象中,中介者使各對象不需要顯示地相互吸引,這些對象只包含中介者的引用。當系統中某個對象需要和系統中另外一個對象交互時,只需要將自己的請求通知給中介者即可。
1.2模式的結構
中介者模式的結構包含四種角色:
(1)中介者(Mediator):中介者是一個介面,該介面定義了用於同事對象之間進行通信的方法。
(2)具體中介者(ConcreteMediator):具體中介者是實現中介者介面的類。具體中介者需要包含所有具體同事的引用,並通過實現中介者介面中的方法來滿足具體同事之間的通信請求。
(3)同事(Colleague):一個介面,規定了具體同事需要實現的方法。
(4)具體同事(ConcreteColleague):實現同事介面的類。具體同事需要包含具體中介者的引用,一個具體同事需要和其他具體同事交互時,只需要將自己的請求通知給它所包含的具體中介者即可。
中介者模式結構的類圖如下圖二所示:
圖二:中介者模式類圖
1.3中介者模式的優點
(1)可以避免許多的對象為了通信而相互顯示引用,否則,不僅系統難於維護,而且也使其他系統難以復用這些對象。
(2)可以通過中介者將原本分佈於多個對象之間的交互行為集中在一起。當這些對象之間需要改變之間的通信行為時,只需要使用一個具體中介者即可,不必修改各個具體同事的代碼,即這些同事可被重用。
(3)具體中介者使得各個具體同事完全解耦,修改任何一個具體同事的代碼不會影響到其他同事。
(4)具體中介者集中了同事之間是如何交互的細節,使系統比較清楚地知道整個系統中的同事是如何交互的。
(5)當一些對象相互通信,但又無法相互包含對方的引用,那麼使用中介者模式就可以使這些對象相互通信。
1.4適合使用中介者模式的情景
(1)許多對象以複雜的方式交互,所導致的依賴關係使系統難以理解和維護。
(2)一個對象引用其他很多對象,導致難以復用該對象。