
上一篇:設計模式實戰-迭代器模式,最經常使用的設計模式之一
一、定義
中介者?其實生活中你們再熟悉不過了這個詞,咱們熟悉的黃牛、房產中介等就是充當中介的角色,將咱們的買票、購房等的需求自身消化再代爲辦理。又好比說中間件,馬老師很忙,不能來一我的有事就直接找馬老師對吧,因此要找一箇中介,客戶來了直接找中間人,中間人再和馬老師溝通,這樣馬老師和客戶那邊就是一個不可見的關係,由中介者角色進行中間協調,馬老師也能抽出更多時間去忙別的事了,解放了至關的生產力。前端
中介者模式(Mediator)的定義:定義一箇中介對象來封裝對象之間的交互,使原有對象之間耦合鬆散,而且能夠獨立地改變它們之間的交互。java
還記得迪米特法則嗎?迪米特法則的初衷在於下降類之間的耦合,中介者模式就是迪米特法則的典型應用。python
二、組成角色
中介者模式的組成角色以下:web
中介者(又稱仲裁者,Mediator):負責定義與 Colleague 角色進行通訊和作出角色的接口;面試
具體中介者、仲裁者(ConcreteMediator):負責實現 Mediator 角色定義的接口,負責具體的業務執行;小程序
同事角色(Colleague):負責定義與 Mediator 角色進行通訊的接口;設計模式
具體同事角色(ConcreteColleague):實現 Colleague 角色定義的接口,通常會有多個實現類。緩存
類圖的話比較簡單,就沒有細分中介者角色了,抽象成了以下三種角色:微信
三、代碼實現網絡
每一個同事角色都知道中介者角色的存在,好比房屋買賣中,賣家和買家都知道房產中介的存在同樣,也就是同事角色間進行通訊時都必須依賴於中介者角色,固然,若是同事角色只是簡單對自身狀態進行變動,不會影響其餘同事角色的狀態時就不須要中介者角色,這種同事角色自發改變自身行爲的行爲稱爲自發行爲,第二種行爲就是依賴其餘對象進行操做的行爲。
中介者模式的代碼以下:
// 抽象同事類
abstract class Colleague {
// 每一個同事類角色都必須知道中介者角色的存在
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
// 具體同事類
class Colleague1 extends Colleague {
public Colleague1(Mediator mediator) {
super(mediator);
}
// 自發行爲
public void doSelfMethod1() {
System.out.println("11111");
}
// 依賴方法
public void depMethod1() {
// 委託給中介者處理的任務
this.mediator.doSomething();
}
}
// 具體同事類
class Colleague2 extends Colleague {
public Colleague2(Mediator mediator) {
super(mediator);
}
// 自發行爲
public void doSelfMethod2() {
System.out.println("22222");
}
// 依賴方法
public void depMethod2() {
// 委託給中介者處理的任務
this.mediator.doSomething();
}
}
// 抽象中介者角色
abstract class Mediator {
// 中介者要協調的同事角色
protected Colleague1 c1;
protected Colleague2 c2;
// 中介者模式的業務邏輯抽象
abstract void doSomething();
public Colleague1 getC1() {
return c1;
}
public void setC1(Colleague1 c1) {
this.c1 = c1;
}
public Colleague2 getC2() {
return c2;
}
public void setC2(Colleague2 c2) {
this.c2 = c2;
}
}
// 具體中介者
class ConcreteMediator extends Mediator{
@Override
void doSomething() {
this.c1.doSelfMethod1();
this.c2.doSelfMethod2();
}
}
具體的測試類:
// 聲明中介者
Mediator mediator = new ConcreteMediator();
// 定義兩個同事角色
Colleague1 c1 = new Colleague1(mediator);
Colleague2 c2 = new Colleague2(mediator);
// 給中介者設置同事角色
mediator.setC1(c1);
mediator.setC2(c2);
c1.depMethod1();
三、優缺點
中介者模式的優勢:
弱化對象間的依賴關係,即鬆耦合,下降同時類的耦合度,符合迪米特法則
將對象間的調用關係進行封裝,使得對象更容易複用
中介者模式的缺點:
若是對象增多,就要去修改抽象中介者和具體的中介者角色
中介者角色承擔了太多了業務邏輯功能,流程複雜時就會顯得比較臃腫,很差管理
四、應用場景
中介者模式的應用場景通常比較明確,當系統有一系列對象須要相互調用,爲弱化對象間的依賴關係,使得這些對象之間鬆耦合。
生活中,最廣泛熟悉的例子就是房屋中介或者 qq 羣這種聊天案例,這裏咱們以房屋中介爲例,中介公司就比如咱們的中介者角色,而業主和買家就構成了兩個不一樣的同事角色,買賣雙方之間的這種交互就能夠交給中介者去對接協調:
// 抽象的中介公司角色,中介者角色中通常都要包含各個同事角色,由於它要負責這些對象之間的交互
abstract class MeditorCompany {
// 中介公司名稱
private String name;
protected ColleagueSeller seller; // 賣家-同事角色
protected ColleagueBuyer buyer; // 買家-同事角色
// 發佈一個需求,由中介公司去代爲發佈,入參爲需求內容、發佈人
abstract void publish(String message, Colleaguer colleaguer);
public MeditorCompany(String name) {
this.name = name;
}
public ColleagueSeller getSeller() {
return seller;
}
public void setSeller(ColleagueSeller seller) {
this.seller = seller;
}
public ColleagueBuyer getBuyer() {
return buyer;
}
public void setBuyer(ColleagueBuyer buyer) {
this.buyer = buyer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 具體的中介公司-貝克找房
class MeditorCompanyBeiKe extends MeditorCompany{
public MeditorCompanyBeiKe(String name) {
super(name);
}
@Override
void publish(String message, Colleaguer colleaguer) {
if (colleaguer instanceof ColleagueSeller) { // 若是是賣家發佈,則買家進行接收
buyer.accept(message);
} else if(colleaguer instanceof ColleagueBuyer) { // 若是是買家發佈,則賣家進行接收
seller.accept(message);
}
}
}
// 抽象的同事角色
abstract class Colleaguer {
protected MeditorCompany meditorCompany; // 對同事類而言,中介者必須是可見的
public Colleaguer(MeditorCompany meditorCompany) {
this.meditorCompany = meditorCompany;
}
}
// 賣家-同事角色
class ColleagueSeller extends Colleaguer {
public ColleagueSeller(MeditorCompany meditorCompany) {
super(meditorCompany);
}
// 同事類發佈一個需求,不過是經過中介公司去發佈,發佈人是本身
public void send(String message) {
meditorCompany.publish(message, this);
}
public void accept(String message) {
System.out.println("賣家接收到的消息是:" + message);
}
}
// 買家-同事角色
class ColleagueBuyer extends Colleaguer {
public ColleagueBuyer(MeditorCompany meditorCompany) {
super(meditorCompany);
}
public void send(String message) {
meditorCompany.publish(message, this);
}
public void accept(String message) {
System.out.println("買家接收到的消息是:" + message);
}
}
測試以下:
// 定義一箇中介者
MeditorCompany meditorCompany = new MeditorCompanyBeiKe("貝克找房");
// 定義一個賣家一個買家同事類
ColleagueSeller colleagueSeller = new ColleagueSeller(meditorCompany);
ColleagueBuyer colleagueBuyer = new ColleagueBuyer(meditorCompany);
// 給中介公司註冊買家、賣家
meditorCompany.setBuyer(colleagueBuyer);
meditorCompany.setSeller(colleagueSeller);
// 操做
colleagueSeller.send("賣家發佈需求...");
colleagueBuyer.send("買家發佈需求...");
結果輸出:
買家接收到的消息是:賣家發佈需求...
賣家接收到的消息是:買家發佈需求...
中介者模式的引入,其實就是爲了解決系統對象相互依賴調用的狀況,能夠想象一下,使用中介者模式後,本來的錯綜複雜的網絡結構就會變成以中介者爲中心的網狀結構,這是中介者模式要解決的問題。
五、總結
本節咱們介紹了中介者模式,要注意的就是,中介者角色承擔了太多的業務功能,而且中介者角色依賴具體的同事角色,一旦同事角色有變動或者添加,中介者角色就須要相應地發生變化,致使二次開發維護變得困難,因此使用的過程當中仍是要多加註意。

在公衆號菜單中可自行獲取專屬架構視頻資料,包括不限於 java架構、python系列、人工智能系列、架構系列,以及最新面試、小程序、大前端均無私奉獻,你會感謝個人哈
往期精選
本文分享自微信公衆號 - 架構師修煉(jiagouxiulian)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。