中介者模式(Mediator Pattern),又稱調(diào)停者模式,是行為類模式的一種。
定義
用一個中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使其耦合松散,而且可以獨立地改變他們的交互。
類圖及組成

- 抽象中介者:定義好同事類對象到中介者對象的接口,用于各個同事類之間的通信。一般包括一個或幾個抽象的事件方法,并由子類去實現(xiàn)。
- 中介者實現(xiàn)類:從抽象中介者繼承而來,實現(xiàn)抽象中介者中定義的事件方法。從一個同事類接收消息,然后通過消息影響其他同時類。
- 同事類:
- 同事類實現(xiàn)類:如果一個對象會影響其他的對象,同時也會被其他對象影響,那么這兩個對象稱為同事類。同事類一般由多個組成,他們之間相互影響,相互依賴。在中介者模式中,同事類之間必須通過中介者才能進(jìn)行消息傳遞。
優(yōu)點
- 簡化了對象之間的關(guān)系,將系統(tǒng)的各個對象之間的關(guān)系進(jìn)行封裝,將各個同事類進(jìn)行解耦,使系統(tǒng)成為松耦合系統(tǒng)。
- 減少子類的生成。
- 減少各同事類的設(shè)計與實現(xiàn)。
缺點
由于中介者對象(中介者模式的核心)封裝了各對象間的相互關(guān)系,導(dǎo)致其變得非常復(fù)雜,系統(tǒng)維護(hù)困難。
原理
中介者模式通過中介者類簡化了系統(tǒng)的結(jié)構(gòu),將系統(tǒng)中有關(guān)對象引用的其他對象數(shù)目減到最少,將網(wǎng)狀結(jié)構(gòu)變?yōu)樾切徒Y(jié)構(gòu),中介者對象在這里起到中轉(zhuǎn)和協(xié)調(diào)作用。

中介者模式和外觀模式的區(qū)別?
- 中介者介于子系統(tǒng)和子系統(tǒng)之間,外觀模式介于客戶和子系統(tǒng)之間。
- 外觀模式將原有復(fù)雜邏輯提取到一個統(tǒng)一的接口,簡化客戶端的使用。中介者模式并沒有改變客戶原有的習(xí)慣,是隱藏在邏輯后面的,使得代碼邏輯清晰可用。
注:當(dāng)系統(tǒng)中連續(xù)出現(xiàn)‘多對多’交互復(fù)雜的對象群,不要急于使用中介者模式,首先反思系統(tǒng)的設(shè)計是否合理。即使使用中介者模式時也要注意控制中介者類的大小。
案例代碼
//抽象中介者類
public abstract class Mediator {
public abstract void send(String message, Colleague colleague);
}
//中介者實現(xiàn)類
public class ConcreteMediator extends Mediator {
// 需要了解所有的具體同事對象
private ConcreteColleague1 c1;
private ConcreteColleague2 c2;
public ConcreteColleague1 getC1() {
return c1;
}
public void setC1(ConcreteColleague1 c1) {
this.c1 = c1;
}
public ConcreteColleague2 getC2() {
return c2;
}
public void setC2(ConcreteColleague2 c2) {
this.c2 = c2;
}
@Override
public void send(String message, Colleague colleague) {
// 重寫發(fā)送信息的方法,根據(jù)對象做出選擇判斷,通知對象
if (colleague == c1) {
c2.notifyMsg(message);
} else {
c1.notifyMsg(message);
}
}
}
//抽象同事類
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void sendMsg(String message);
public abstract void notifyMsg(String message);
}
//同事類實現(xiàn)類
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String message) {
mediator.send(message, this);
}
@Override
public void notifyMsg(String message) {
System.out.println("同事1得到消息:" message);
}
}
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String message) {
mediator.send(message, this);
}
@Override
public void notifyMsg(String message) {
System.out.println("同事2得到消息:" message);
}
}
-------------------------------------------------------------------------------------
來源:http://www./content-4-215351.html
|