核心
- 如果一個(gè)系統(tǒng)中對(duì)象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu),對(duì)象之間存在大量多對(duì)多關(guān)系,將導(dǎo)致關(guān)系極其復(fù)雜,這些對(duì)象稱為"同事對(duì)象"。
-
我們可以引入一個(gè)中介者對(duì)象,使各個(gè)同事對(duì)象只跟中介者對(duì)象打交道,將復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)化解為星形結(jié)構(gòu)。
中介者模式
package mediator;
// 中介類接口
public interface Mediator {
void register(String dname,Department d);
void command(String dname);
}
package mediator;
// 同事類接口
public interface Department {
void selfAction(); // 做本部門的事情
void outAction(); // 向經(jīng)理發(fā)出申請(qǐng)
}
package mediator;
public class Finacial implements Department{
private Mediator mediator; // 持有中介者(經(jīng)理)的引用
public Finacial(Mediator mediator) {
this.mediator = mediator;
mediator.register("Finacial",this);
}
public void selfAction() {
System.out.println("財(cái)務(wù)部:專心數(shù)錢,打錢");
}
public void outAction() {
System.out.println("財(cái)務(wù)部:匯報(bào)工作,買買買");
}
}
package mediator;
public class Market implements Department{
private Mediator mediator; // 持有中介者(經(jīng)理)的引用
public Market(Mediator mediator) {
this.mediator = mediator;
mediator.register("Market",this);
}
public void selfAction() {
System.out.println("市場(chǎng)部:專心跑業(yè)務(wù)");
}
public void outAction() {
System.out.println("市場(chǎng)部:匯報(bào)工作,申請(qǐng)資金");
mediator.command("Finacial");
}
}
package mediator;
import java.util.HashMap;
import java.util.Map;
// 經(jīng)理類
public class President implements Mediator{
private Map<String,Department> map = new HashMap<String, Department>();
public void register(String dname, Department d) {
map.put(dname,d);
}
public void command(String dname) {
map.get(dname).selfAction();
}
}
package mediator;
public class Client {
public static void main(String[] args) {
Mediator mediator = new President();
Market market = new Market(mediator);
Development development = new Development(mediator);
Finacial finacial = new Finacial(mediator);
market.selfAction();
market.outAction();
}
}
輸出:
市場(chǎng)部:專心跑業(yè)務(wù)
市場(chǎng)部:匯報(bào)工作,申請(qǐng)資金
財(cái)務(wù)部:專心數(shù)錢,打錢
中介者模式的本質(zhì)
解耦多個(gè)同事對(duì)象之間的交互關(guān)系。每個(gè)對(duì)象都持有中介者對(duì)象的引用,只跟中介者對(duì)象打交道。我們通過中介者對(duì)象統(tǒng)一管理這些交互關(guān)系。
開發(fā)中常見的場(chǎng)景
- MVC模式(其中的C,控制器就是一個(gè)中介者對(duì)象。M和V都和他打交道)
- 窗口游戲程序,窗口軟件開發(fā)中窗口對(duì)象也是一個(gè)中介者對(duì)象
- 圖形界面開發(fā)GUI中,多個(gè)組件之間的交互,可以通過引入一個(gè)中介者對(duì)象來解決,可以是整體的窗口對(duì)象或者DOM對(duì)象。
- Java.lang.reflect.Method#invoke()
優(yōu)缺點(diǎn)
中介者模式很容易在系統(tǒng)中應(yīng)用,也很容易在系統(tǒng)中誤用。當(dāng)系統(tǒng)出現(xiàn)了“多對(duì)多”交互復(fù)雜時(shí)的對(duì)象群時(shí),不要急于使用中介者模式,而要先反思你的系統(tǒng)在設(shè)計(jì)上是不是合理。
優(yōu)點(diǎn)
- Mediator的出現(xiàn)減少了各個(gè)Colleague的耦合,使得可以獨(dú)立地改變和復(fù)用各個(gè)Colleague類和Mediator
- 由于把對(duì)象如何協(xié)作進(jìn)行了抽象,將中介作為一個(gè)獨(dú)立地概念并將其封裝在一個(gè)對(duì)象中,這樣關(guān)注的對(duì)象就從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來,也就是站在一個(gè)更宏觀的角度去看待系統(tǒng)
缺點(diǎn)
- 由于ConcreteMediator控制了集中化,于是就把交互復(fù)雜性變?yōu)榱酥薪檎叩膹?fù)雜性,這就使得中介者會(huì)變得比任何一個(gè)ConcreteColleague都復(fù)雜。
