介紹
中介者模式(Mediator Pattern) 也成為調(diào)節(jié)者模式或調(diào)停者模式鳍悠。
定義
中介者模式包裝了一系列對象相互作用的方式税娜,使得這些對象不必相互明顯作用。從而使他們可以松散耦合藏研。當(dāng)某些對象之間的作用發(fā)生改變時(shí)敬矩,不會立刻影響其他的一些對象之間的作用。保證這些作用可以彼此獨(dú)立的變化蠢挡。中介者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用弧岳。中介者模式將對象的行為和協(xié)作抽象化凳忙,把對象在小尺度的行為上與其他對象的相互作用分開處理。
使用場景
當(dāng)對象之間的交互操作很多且每個對象的行為操作都依賴彼此時(shí)禽炬,為防止在修改一個對象的行為時(shí)涧卵,同時(shí)涉及修改很多其它對象的行為,可采用中介者模式腹尖,來解決緊耦合問題柳恐。該模式將對象之間的多對多關(guān)系變成一對多關(guān)系,中介者對象將系統(tǒng)從網(wǎng)狀結(jié)構(gòu)變成以調(diào)停者為中心的星行結(jié)構(gòu)热幔,達(dá)到降低系統(tǒng)的復(fù)雜性乐设,提高可擴(kuò)展的作用。
角色介紹
Mediator 抽象中介者角色绎巨,定義了同事對象到中介者對象的接口近尚,同事對象指的是多個相互作用的對象。還定義了抽象中介方法场勤,抽象中介方法用來與同事對象交互戈锻。抽象中介者角色一般以抽象類的方式實(shí)現(xiàn)
ConcreteMediator 具體中介者角色,繼承于抽象中介者却嗡,實(shí)現(xiàn)了父類定義的方法舶沛,它從具體的同事對象接收消息嘹承,向具體的同事對象發(fā)出命令窗价。
Colleague 抽象的同事類角色,定義了中介者對象的接口叹卷,它只知道中介者而不知道其他同事對象
ConcreteColleague 具體的同事類角色撼港,繼承于抽象同事類,每個具體同事類都知道本身在小范圍內(nèi)的行文骤竹,而不知道它在大范圍內(nèi)的目的帝牡。
在中介者中保存各個同事對象的引用,各個同事對象中也有中介者對象的引用蒙揣。當(dāng)某個同事對象的狀態(tài)發(fā)生改變時(shí)靶溜,會通知中介者其發(fā)生了改變,這時(shí)中介者會根據(jù)發(fā)生改變的同事對象以及發(fā)生的改變通知其他需要產(chǎn)生交互的同事對象懒震,其通知方法為調(diào)用需要被通知的同事對象的特定方法罩息。從而以低耦合的方式完成不同同事對象之間的交互。
Android 源碼中的中介者模式
Keyguard 鎖屏功能實(shí)現(xiàn)个扰,KeyguardViewMediator 中瓷炮,看到很多 XXXManager 管理器的成員變量,各種各樣的管理器就是各個具體的同事類递宅, Android 使用 KeyguardViewMediator 來充當(dāng)中介者協(xié)調(diào)這些管理器的狀態(tài)改變娘香,并且該類中也定義了很多方法來處理這些管理器的狀態(tài)苍狰。例如鎖屏音效的播放,KeyguardViewMediator 中對應(yīng) playSounds 方法來協(xié)調(diào)音頻的這一狀態(tài)烘绽。KeyguardViewMediator 中還有很多類似的協(xié)調(diào)方法淋昭。
開發(fā)實(shí)例
在界面開發(fā)過程中,某些 UI 控件的狀態(tài)會影響其他控件的狀態(tài)安接,這時(shí)候我們在 Activity 中為各個控件設(shè)置監(jiān)聽响牛,當(dāng)控件狀態(tài)改變時(shí)都將其信息傳給 Activity,再由 Activity 來通知其他控件發(fā)生交互赫段,Activity 充當(dāng)中介者來協(xié)調(diào)這些控件的狀態(tài)呀打。
總結(jié)
在多個類依賴關(guān)系如網(wǎng)狀般復(fù)雜時(shí),適當(dāng)?shù)氖褂弥薪檎吣J娇梢詫@種依賴關(guān)系進(jìn)行解耦使邏輯結(jié)構(gòu)清晰糯笙。
但是如果幾個類直接依賴關(guān)系并不復(fù)雜贬丛,使用中介者模式反而使原本不復(fù)雜的邏輯結(jié)構(gòu)變得復(fù)雜。
因此我們決定使用中介者模式之前要多方考慮给涕,權(quán)衡利弊豺憔。