定義
中介者模式(Mediator Pattern):用一個(gè)中介對(duì)象(中介者)來(lái)封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式。
通俗理解
中介,在生活中經(jīng)常聽(tīng)得到的詞匯。租房子的時(shí)候,我們會(huì)找租房的中介;買房子的時(shí)候,我們會(huì)找買房的中介;找對(duì)象的時(shí)候,我們會(huì)去找紅娘等等。通常我們都會(huì)給中介一點(diǎn)費(fèi)用,然后中介會(huì)根據(jù)我們的要求給我們找好相關(guān)的東西,我們所需要的只是簽一個(gè)字就可以了,簡(jiǎn)直是簡(jiǎn)化了我們的生活呀。
現(xiàn)在有些中介真是煩人,我們已經(jīng)租了房子了,但是還是會(huì)有其他的中介打電話過(guò)來(lái),問(wèn)我們是不是需要租房子,不勝其擾。有時(shí)候我們會(huì)抱怨中介的費(fèi)用太高,也許租一個(gè)房子只需要2000一個(gè)月的,但是我們給中介的費(fèi)用就需要3000,不能忍。但是,即使是這樣,我們有沒(méi)有想過(guò),如果這個(gè)世界沒(méi)有中介了,那么會(huì)發(fā)生什么事情?
第一,我們必須任何的事情都親力親為了,找房子,我們需要一家一家地去和房東溝通,和他們談判;搬家,只能去找街頭的面包車師傅搬運(yùn),然后被面包車師傅宰了一頓,也全然不知。第二,我們不能搞混和這些人的身份,房東是房東,面包車師傅是面包車師傅,把房租交個(gè)面包車師傅(只是個(gè)比喻,一般不會(huì)出現(xiàn)這種事故),那就貽笑大方了。
中介者模式就是這樣的一個(gè)模式。系統(tǒng)中的對(duì)象,和中介進(jìn)行交互,形成一種星型結(jié)構(gòu),而不是彼此交互,對(duì)象A調(diào)用對(duì)象B,對(duì)象B調(diào)用對(duì)象C,形成一個(gè)網(wǎng)狀結(jié)構(gòu)。而且,引入中介,是迪米特法則的典型應(yīng)用。
示例
按照租房子,買房子,找對(duì)象為業(yè)務(wù)。
渣渣程序
租房子、買房子、找對(duì)象。
public class RentRoom {
public void rentRoom() {
System.out.println("租房子");
}
}
public class BuyRoom {
public void buyRoom() {
System.out.println("買房子");
}
}
public class FindObject {
public void findObject() {
System.out.println("找對(duì)象");
}
}
程序入口
public class Main {
public static void main(String[] args) {
RentRoom rentRoom = new RentRoom();
BuyRoom buyRoom = new BuyRoom();
FindObject findObject = new FindObject();
rentRoom.rentRoom();
buyRoom.buyRoom();
findObject.findObject();
}
}
//租房子
//買房子
//找對(duì)象
上面只是簡(jiǎn)化后的一個(gè)寫(xiě)法,如果考慮買房子前必須要租房幾年,找對(duì)象必須要買房子,買房子后要把租的房子退掉,找了對(duì)象之后也可以住在租的房子里面的情況... ... 那么造成對(duì)象之間的結(jié)構(gòu)變復(fù)雜,并增加耦合度;組件難重用,租房都已經(jīng)耦合了買房、找對(duì)象之類的方法,不是單純的租房,其他系統(tǒng)調(diào)用只是想租房而已,為什么還需要找對(duì)象和買房呢?而且擴(kuò)展性差,增加一個(gè)新的對(duì)象,也需要把這個(gè)對(duì)象耦合進(jìn)去,這個(gè)網(wǎng)越織越大,最后亂糟糟一團(tuán)。
優(yōu)化
類圖
程序
系統(tǒng)對(duì)象與實(shí)現(xiàn)
public interface Colleague {
void operation();
}
public class BuyRoom implements Colleague {
public void buyRoom() {
System.out.println("買房子");
}
public void operation() {
buyRoom();
}
}
//RentRoom、FindObject類似,省略
中介者接口與實(shí)現(xiàn)
public interface Mediator {
void operation(Colleague colleague);
}
public class ConcreteMediator implements Mediator {
public void operation(Colleague colleague) {
colleague.operation();
}
}
調(diào)用
public class Main {
public static void main(String[] args) {
Colleague rendRoom = new RentRoom();
Mediator mediator = new ConcreteMediator();
mediator.operation(rendRoom);
}
}
//租房子
這樣,以后對(duì)象之間的調(diào)用,只需要引入Mediator就可以實(shí)現(xiàn)調(diào)用。
優(yōu)點(diǎn)
- 簡(jiǎn)化調(diào)用,由原來(lái)對(duì)象和對(duì)象之間的多對(duì)多調(diào)用變成了對(duì)象和中介類的一對(duì)一的調(diào)用;
- 解耦合,加入新的對(duì)象,只需要在在中介類中添加相關(guān)的方法即可;
- 減少子類的生成。
缺點(diǎn)
- 中介類復(fù)雜。
應(yīng)用場(chǎng)景
- 系統(tǒng)中存在復(fù)雜的引用關(guān)系,結(jié)構(gòu)混亂難理解;
- 一個(gè)類中應(yīng)用了其他類,難做到復(fù)用;
- 通過(guò)中間類來(lái)封裝多個(gè)類中的行為。
程序
吐槽
又是封一層。