中介者模式(Mediator)
場景(中介大家熟悉嗎?房産中介?):
假如沒有總經理。下面三個部門:财務部、市場部、研發部。财務部要發工資,讓大家核對公司需要跟市場部和研發部都通氣;市場部要接個新項目,需要研發部處理技術、需要财務部出資金。市場部跟各個部門打交道。 雖然隻有三個部門,但是關系非常亂。
實際上,公司都有總經理。各個部門有什麼事情都通報到總經理這裡,總經理再通知各個相關部門。這就是一個典型的“中介者模式”,總經理起到一個中介、協調的作用
實作核心
如果一個系統中對象之間的聯系呈現為網狀結構,對象之間存在大量多對多關系,将導緻關系及其複雜,這些對象稱為"同僚對象",我們可以引入一個中介者對象,使各個同僚對象隻跟中介者對象打交道,将複雜的網絡結構化解為星型結構。
案例類圖案例實作
定義中介者
/**
* 中介者接口
* @author 波波烤鴨
* @email [email protected]
*
*/
public interface Mediator {
/**
* 注冊 同僚
* @param dname
* @param d
*/
void register(String dname,Department d);
/**
* 執行 處理
* @param dname
*/
void command(String dname);
}
建立中介者實作
/**
* 中介者的實作類
* @author 波波烤鴨
* @email [email protected]
*
*/
public class President implements Mediator {
private Map<String,Department> map = new HashMap<String , Department>();
@Override
public void command(String dname) {
map.get(dname).selfAction();
}
@Override
public void register(String dname, Department d) {
map.put(dname, d);
}
}
建立同僚接口
/**
* 同僚類的接口
* @author 波波烤鴨
* @email [email protected]
*
*/
public interface Department {
void selfAction(); //做本部門的事情
void outAction(); //向總經理發出申請
}
建立同僚實作類
市場部
/**
* 市場部
* @author 波波烤鴨
* @email [email protected]
*
*/
public class Market implements Department {
private Mediator m; //持有中介者(總經理)的引用
public Market(Mediator m) {
super();
this.m = m;
m.register("market", this);
}
@Override
public void outAction() {
System.out.println("彙報工作!項目承接的進度,需要資金支援!");
m.command("finacial");
}
@Override
public void selfAction() {
System.out.println("跑去接項目!");
}
}
财務部
/**
* 财務部
* @author 波波烤鴨
* @email [email protected]
*
*/
public class Financial implements Department {
private Mediator m; //持有中介者(總經理)的引用
public Financial(Mediator m) {
super();
this.m = m;
m.register("finacial", this);
}
@Override
public void outAction() {
System.out.println("彙報工作!沒錢了,錢太多了!怎麼花?");
}
@Override
public void selfAction() {
System.out.println("數錢!");
}
}
開發部
/**
* 開發部
* @author 波波烤鴨
* @email [email protected]
*
*/
public class Development implements Department {
private Mediator m; //持有中介者(總經理)的引用
public Development(Mediator m) {
super();
this.m = m;
m.register("development", this);
}
@Override
public void outAction() {
System.out.println("彙報工作!沒錢了,需要資金支援!");
}
@Override
public void selfAction() {
System.out.println("專心科研,開發項目!");
}
}
用戶端
public class Client {
public static void main(String[] args) {
// 擷取中介者對象
Mediator m = new President();
// 擷取同僚對象,執行個體化的時候會在中介者對象中注冊
Market market = new Market(m);
Development devp = new Development(m);
Financial f = new Financial(m);
market.selfAction();
market.outAction();
}
}
中介者模式的本質:
解耦多個同僚對象之間的互動關系。每個對象都持有中介者對象的引用,隻跟中介者對象打交道。我們通過中介者對象統一管理這些互動關系
開發中常見的場景:
MVC模式(其中的C,控制器就是一個中介者對象。M和V都和他打交道) – 視窗遊戲程式,視窗軟體開發中視窗對象也是一個中介者對象
圖形界面開發GUI中,多個元件之間的互動,可以通過引入一個中介者對象來解決,可以是整體的視窗對象或者DOM對象
Java.lang.reflect.Method#invoke()