設計模式實戰-中介模式,爲你牽橋搭線

點擊上方藍色字關注咱們~








上一篇:設計模式實戰-迭代器模式,最經常使用的設計模式之一

一、定義

中介者?其實生活中你們再熟悉不過了這個詞,咱們熟悉的黃牛、房產中介等就是充當中介的角色,將咱們的買票、購房等的需求自身消化再代爲辦理。又好比說中間件,馬老師很忙,不能來一我的有事就直接找馬老師對吧,因此要找一箇中介,客戶來了直接找中間人,中間人再和馬老師溝通,這樣馬老師和客戶那邊就是一個不可見的關係,由中介者角色進行中間協調,馬老師也能抽出更多時間去忙別的事了,解放了至關的生產力。前端

中介者模式(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系列、人工智能系列、架構系列,以及最新面試、小程序、大前端均無私奉獻,你會感謝個人哈


往期精選

架構的本質:如何打造一個有序的系統?

分佈式高可靠之負載均衡,今天看了你確定會

分佈式數據之緩存技術,一塊兒來揭開其神祕面紗

分佈式數據複製技術,今天就教你真正分身術

數據分佈方式之哈希與一致性哈希,我就是個神算子

分佈式存儲系統三要素,掌握這些就離成功不遠了

想要設計一個好的分佈式系統,必須搞定這個理論

分佈式通訊技術之發佈訂閱,乾貨滿滿

分佈式通訊技術之遠程調用:RPC

秒殺系統每秒上萬次下單請求,咱們該怎麼去設計

CDN加速技術,做爲開發的咱們真的不須要懂嗎?



本文分享自微信公衆號 - 架構師修煉(jiagouxiulian)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索