一、場景
假如沒有總經(jīng)理劳跃。下面三個部門:財務(wù)部、市場部、研發(fā)部。財務(wù)部要發(fā)工資电抚,讓大家核對公司需要跟市場部和研發(fā)部都通氣惕稻;市場部要接個新項目竖共,需要研發(fā)部處理技術(shù)、需要財務(wù)部出資金俺祠。市場部跟各個部門打交道公给。雖然只有三個部門,但是關(guān)系非常亂蜘渣。
實際上淌铐,公司都有總經(jīng)理。各個部門有什么事情都通報到總經(jīng)理蔫缸,這里腿准,總經(jīng)理再通知各個相關(guān)部門。這就像一個中介者模式拾碌。
二吐葱、核心
如果一個系統(tǒng)中對象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu),對象之間存在大量多對多關(guān)系校翔,將導(dǎo)致關(guān)系極其復(fù)雜弟跑,這些對象成為“同事對象”
我們可以引入一個中介者對象,使各個同事對象只跟中介者對象打交道防症,將復(fù)雜的網(wǎng)狀結(jié)構(gòu)化解為星形結(jié)構(gòu)孟辑。
三、本質(zhì)
解耦多個同事對象之間的交互關(guān)系蔫敲。每個對象都持有中介者對象的引用饲嗽,只跟中介者打交道。我們通過中介者對象統(tǒng)一管理這些交互關(guān)系奈嘿。
四喝噪、實例
Mediator.java
package cn.itcast.day245.mediator;
//中介者接口
public interface Mediator {
public void register(String dname, Department d);//處理別人回報上來的事情
public void command(String dname);//向相關(guān)人員發(fā)出命令
}
President.java
package cn.itcast.day245.mediator;
import java.util.HashMap;
import java.util.Map;
//總經(jīng)理:中介者的具體實現(xiàn)類
public class President implements Mediator{
//保存各個部門
private Map<String, Department> map = new HashMap<String, Department>();
@Override
public void register(String dname, Department d) {
map.put(dname, d);
}
@Override
public void command(String dname) {
map.get(dname).selfAction();//可以調(diào)用不同的命令
}
}
說明:以上即中介者接口和一個具體的中介者類(此處是總經(jīng)理)。
Department.java
package cn.itcast.day245.mediator;
//同事類的接口
public interface Department {
public void selfAction();//本部門的事情
public void outAction();//向總經(jīng)理發(fā)出申請
}
Development.java
package cn.itcast.day245.mediator;
//研發(fā)部
public class Development implements Department {
private Mediator mediator;//持有中介者(總經(jīng)理)的引用
public Development(Mediator mediator) {
this.mediator = mediator;
mediator.register("development", this);
}
@Override
public void selfAction() {
System.out.println("專心科研開發(fā)項目");
}
@Override
public void outAction() {
System.out.println("向總經(jīng)理回報工作指么,需要資金支持");
}
}
Financial.java
package cn.itcast.day245.mediator;
//財務(wù)部
public class Financial implements Department {
private Mediator mediator;//持有中介者(總經(jīng)理)的引用
public Financial(Mediator mediator) {
this.mediator = mediator;
mediator.register("financial", this);
}
@Override
public void selfAction() {
System.out.println("財務(wù)部給錢");
}
@Override
public void outAction() {
System.out.println("向總經(jīng)理回報財務(wù)情況");
}
}
Market.java
package cn.itcast.day245.mediator;
//市場部
public class Market implements Department {
private Mediator mediator;//持有中介者(總經(jīng)理)的引用
public Market(Mediator mediator) {
this.mediator = mediator;
mediator.register("market", this);
}
@Override
public void selfAction() {
System.out.println("談項目");
}
@Override
public void outAction() {
System.out.println("向總經(jīng)理回報項目談判進度酝惧,需要資金支持");
mediator.command("financial");
}
}
說明:以上就是同事類接口和三個具體的同事類榴鼎,他們一方面處理自己本身的工作,同時和需要和外界打交道晚唇,而和外界打交道的時候只是與中介者類(總經(jīng)理)進行交互巫财,所以我們需要持有中介者的引用,而和外界的交互工作就交給總經(jīng)理去處理了哩陕。這里我們看市場部在和外界交互的時候發(fā)現(xiàn)將需要交互的信息傳遞給中介者平项,然后中介者來處理具體的事情。
Client.java
package cn.itcast.day245.mediator;
public class Client {
public static void main(String[] args) {
Mediator mediator = new President();
Market market = new Market(mediator);
Development dev = new Development(mediator);
Financial financial = new Financial(mediator);
market.selfAction();
market.outAction();
}
}
五悍及、開發(fā)中常見的場景:
MVC
模式(其中的C
是一個控制器闽瓢,也是一個中介者對象),M
和V
都只和它打交道窗口游戲程序心赶,窗口軟件開發(fā)中窗口對象也是一個中介者對象
圖形界面開發(fā)
GUI
中扣讼,多個組件之間的交互,可以通過引用一個中介者對象來解決缨叫,可以是整體的窗口對象或者DOM
對象java.lang.reflect.Method#invoke()