介紹
用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
中介者模式包括以下角色:
抽象中介者(Mediator)角色:定義出同事對(duì)象到中介者對(duì)象的接口,其中主要方法是一個(gè)(或多個(gè))事件方法。
具體中介者(ConcreteMediator)角色:實(shí)現(xiàn)了抽象中介者所聲明的事件方法。具體中介者知曉所有的具體同事類,并負(fù)責(zé)具體的協(xié)調(diào)各同事對(duì)象的交互關(guān)系。
抽象同事類(Colleague)角色:定義出中介者到同事對(duì)象的接口。同事對(duì)象只知道中介者而不知道其余的同事對(duì)象。
具體同事類(ConcreteColleague)角色:所有的具體同事類均從抽象同事類繼承而來(lái)。實(shí)現(xiàn)自己的業(yè)務(wù),在需要與其他同事通信的時(shí)候,就與持有的中介者通信,中介者會(huì)負(fù)責(zé)與其他的同事交互。
示例圖如下:

中介者模式的簡(jiǎn)單示例
小明的店鋪主要是賣鍵盤和鼠標(biāo)以及組裝電腦,而顧客小紅想要買一臺(tái)組裝電腦,但是由于賣電腦的店鋪實(shí)在太多和里面水分太多,為了避免受騙,小紅去找了一家信譽(yù)很好的中介來(lái)幫忙處理。
抽象同事類Colleague角色,用于下面店鋪和顧客繼承
public abstract class Colleague {
protected String name;
protected Mediator mediator;
Colleague(String name,Mediator mediator){
this.name = name;
this.mediator = mediator;
}
}
具體同事類:顧客
public class Customer extends Colleague {
public Customer(String name, Mediator mediator) {
super(name, mediator);
}
/**
* 與中介者聯(lián)系
*/
public void constact(String message) {
mediator.constact(message, this);
}
/**
* 獲取信息
*/
public void getMessage(String message) {
System.out.println("顧客:" + name + ", 獲得信息:" + message);
}
}
具體同事類:店鋪
public class Shop extends Colleague{
public Shop(String name, Mediator mediator) {
super(name, mediator);
}
/**
* 與中介者聯(lián)系
*/
public void constact(String message) {
mediator.constact(message, this);
}
/**
* 獲取信息
*/
public void getMessage(String message) {
System.out.println("店鋪:" + name + ", 獲得信息:" + message);
}
}
抽象中介者Mediator角色,提供一個(gè)聯(lián)系的方法
public abstract class Mediator {
//申明一個(gè)聯(lián)絡(luò)方法
public abstract void constact(String message, Colleague colleague);
}
具體中介者,從代碼可以看出,中介者引入了所有的Colleague角色,然后在兩個(gè)具體Colleague角色中流轉(zhuǎn),封裝了一些交互操作。
public class MediatorStructure extends Mediator{
private Customer customer;
private Shop shop;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Shop getShop() {
return shop;
}
public void setShop(Shop shop) {
this.shop = shop;
}
public void constact(String message, Colleague colleague) {
if(colleague instanceof Customer){
//顧客來(lái)詢問(wèn),中介去問(wèn)店鋪,店鋪獲得消息
shop.getMessage(message);
}
else{
//店鋪回復(fù),中介通知顧客,顧客獲得消息
customer.getMessage(message);
}
}
}
顧客通過(guò)中介去拿到一份電腦組裝的清單,店鋪通過(guò)中介返回一份電腦清單給顧客。顧客與店鋪并沒(méi)有直接的引用關(guān)聯(lián),都是通過(guò)中介來(lái)實(shí)現(xiàn)。
public class Client {
public static void main(String[] args) {
//一個(gè)店鋪、一個(gè)顧客、一個(gè)中介
MediatorStructure mediator = new MediatorStructure();
//店鋪和顧客只需要知道中介即可
Customer customer = new Customer("小紅", mediator);
Shop shop = new Shop("小明", mediator);
//中介要知道店鋪和顧客
mediator.setCustomer(customer);
mediator.setShop(shop);
customer.constact("我想要組裝一臺(tái)電腦,價(jià)位在5k左右");
shop.constact("好的!這是5k的配置信息,請(qǐng)查收...");
}
}
輸出結(jié)果
店鋪:小明, 獲得信息:我想要組裝一臺(tái)電腦,價(jià)位在5k左右
顧客:小紅, 獲得信息:好的!這是5k的配置信息,請(qǐng)查收...
總結(jié)
中介者模式的優(yōu)點(diǎn)
- 松散耦合
中介者模式通過(guò)把多個(gè)同事對(duì)象之間的交互封裝到中介者對(duì)象里面,從而使得同事對(duì)象之間松散耦合,基本上可以做到互補(bǔ)依賴。這樣一來(lái),同事對(duì)象就可以獨(dú)立地變化和復(fù)用,而不再像以前那樣“牽一處而動(dòng)全身”了。 - 集中控制交互
多個(gè)同事對(duì)象的交互,被封裝在中介者對(duì)象里面集中管理,使得這些交互行為發(fā)生變化的時(shí)候,只需要修改中介者對(duì)象就可以了,當(dāng)然如果是已經(jīng)做好的系統(tǒng),那么就擴(kuò)展中介者對(duì)象,而各個(gè)同事類不需要做修改。 - 多對(duì)多變成一對(duì)多
沒(méi)有使用中介者模式的時(shí)候,同事對(duì)象之間的關(guān)系通常是多對(duì)多的,引入中介者對(duì)象以后,中介者對(duì)象和同事對(duì)象的關(guān)系通常變成雙向的一對(duì)多,這會(huì)讓對(duì)象的關(guān)系更容易理解和實(shí)現(xiàn)。
中介模式的缺點(diǎn)
中介者模式的一個(gè)潛在缺點(diǎn)是,過(guò)度集中化。如果同事對(duì)象的交互非常多,而且比較復(fù)雜,當(dāng)這些復(fù)雜性全部集中到中介者的時(shí)候,會(huì)導(dǎo)致中介者對(duì)象變得十分復(fù)雜,而且難于管理和維護(hù)。