一、場景
假如沒有總經理。下面三個部門:財務部、市場部、研發部。財務部要發工資,讓大家核對公司需要跟市場部和研發部都通氣;市場部要接個新項目,需要研發部處理技術、需要財務部出資金。市場部跟各個部門打交道。雖然只有三個部門,但是關系非常亂。
實際上,公司都有總經理。各個部門有什么事情都通報到總經理,這里,總經理再通知各個相關部門。這就像一個中介者模式。
二、核心
如果一個系統中對象之間的聯系呈現為網狀結構,對象之間存在大量多對多關系,將導致關系極其復雜,這些對象成為“同事對象”
我們可以引入一個中介者對象,使各個同事對象只跟中介者對象打交道,將復雜的網狀結構化解為星形結構。
三、本質
解耦多個同事對象之間的交互關系。每個對象都持有中介者對象的引用,只跟中介者打交道。我們通過中介者對象統一管理這些交互關系。
四、實例
Mediator.java
package cn.itcast.day245.mediator;
//中介者接口
public interface Mediator {
public void register(String dname, Department d);//處理別人回報上來的事情
public void command(String dname);//向相關人員發出命令
}
President.java
package cn.itcast.day245.mediator;
import java.util.HashMap;
import java.util.Map;
//總經理:中介者的具體實現類
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();//可以調用不同的命令
}
}
說明:以上即中介者接口和一個具體的中介者類(此處是總經理)。
Department.java
package cn.itcast.day245.mediator;
//同事類的接口
public interface Department {
public void selfAction();//本部門的事情
public void outAction();//向總經理發出申請
}
Development.java
package cn.itcast.day245.mediator;
//研發部
public class Development implements Department {
private Mediator mediator;//持有中介者(總經理)的引用
public Development(Mediator mediator) {
this.mediator = mediator;
mediator.register("development", this);
}
@Override
public void selfAction() {
System.out.println("專心科研開發項目");
}
@Override
public void outAction() {
System.out.println("向總經理回報工作,需要資金支持");
}
}
Financial.java
package cn.itcast.day245.mediator;
//財務部
public class Financial implements Department {
private Mediator mediator;//持有中介者(總經理)的引用
public Financial(Mediator mediator) {
this.mediator = mediator;
mediator.register("financial", this);
}
@Override
public void selfAction() {
System.out.println("財務部給錢");
}
@Override
public void outAction() {
System.out.println("向總經理回報財務情況");
}
}
Market.java
package cn.itcast.day245.mediator;
//市場部
public class Market implements Department {
private Mediator mediator;//持有中介者(總經理)的引用
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("向總經理回報項目談判進度,需要資金支持");
mediator.command("financial");
}
}
說明:以上就是同事類接口和三個具體的同事類,他們一方面處理自己本身的工作,同時和需要和外界打交道,而和外界打交道的時候只是與中介者類(總經理)進行交互,所以我們需要持有中介者的引用,而和外界的交互工作就交給總經理去處理了。這里我們看市場部在和外界交互的時候發現將需要交互的信息傳遞給中介者,然后中介者來處理具體的事情。
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();
}
}
五、開發中常見的場景:
MVC
模式(其中的C
是一個控制器,也是一個中介者對象),M
和V
都只和它打交道窗口游戲程序,窗口軟件開發中窗口對象也是一個中介者對象
圖形界面開發
GUI
中,多個組件之間的交互,可以通過引用一個中介者對象來解決,可以是整體的窗口對象或者DOM
對象java.lang.reflect.Method#invoke()