中介者模式(Mediator Pattern)也被稱為調停者模式,是在 GoF 23 種設計模式中定義了的行為型模式。
中介者模式 是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,并支持松耦合,使代碼易于維護。
~
本篇文章內容包括:關于中介模式、中介者模式 Demo
文章目錄
- 一、關于中介模式
- 1、關于中介者模式
- 2、關于中介者模式的構成
- 3、關于中介者模式的UML
- 4、關于中介者模式的適用場景
- 5、關于中介者模式的優缺點
- 二、中介者模式 Demo
- 1、Demo 設計
- 2、Demo 實現
- 3、Demo 測試
一、關于中介模式
1、關于中介者模式
中介者模式(Mediator Pattern)也被稱為調停者模式,是在 GoF 23 種設計模式中定義了的行為型模式。
中介者模式 是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,并支持松耦合,使代碼易于維護。
中介者模式 的核心在于中介者類的引入,在中介者模式中,中介者類承擔了兩方面的職責 (所有對象之間的交互都 在 Mediator 類中進行):
- 中轉作用(結構性):通過中介者提供的中轉作用,各個同事對象就不再需要顯式引用其他同事,當需要和其他同事進行通信時,可通過中介者來實現間接調用。該中轉作用屬于中介者在結構上的支持。
- 協調作用(行為性):中介者可以更進一步的對同事之間的關系進行封裝,同事可以一致的和中介者進行交互,而不需要指明中介者需要具體怎么做,中介者根據封裝在自身內部的協調邏輯,對同事的請求進行進一步處理,將同事成員之間的關系行為進行分離和封裝。該協調作用屬于中介者在行為上的支持。
2、關于中介者模式的構成
中介者模式包含以下主要 4 種角色。
- 抽象中介者接口(Mediator)角色:它是中介者的接口,提供了同事對象注冊與轉發同事對象信息的抽象方法(通信)。
- 具體中介者(ConcreteMediator)角色:實現中介者接口, 是抽象中介者的子類 ,定義一個 List 來管理同事對象,協調各個同事角色之間的交互關系, 維持了對各個同事對象的引用 ,因此它依賴于同事角色。
- 抽象同事類(Colleague)角色: 它定義各個同事類公有的方法,并聲明了一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信。
- 具體同事類(Concrete Colleague)角色: 它是抽象同事類的子類;每一個同事對象在需要和其他同事對象通信時,先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實現了在抽象同事類中聲明的抽象方法。
3、關于中介者模式的UML
4、關于中介者模式的適用場景
- 系統中對象之間存在復雜的引用關系,系統結構混亂且難以理解。
- 一個對象由于引用了其他很多對象并且直接和這些對象通信,導致難以復用該對象。
- 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。可以通過引入中介者類來實現,在中介者中定義對象交互的公共行為,如果需要改變行為則可以增加新的具體中介者類。
5、關于中介者模式的優缺點
# 中介者模式的優點
- 松散耦合:中介者模式通過把多個同事對象之間的交互封裝到中介者對象里面,從而使得同事對象之間松散耦合,基本上可以做到互補依賴。這樣一來,同事對象就可以獨立地變化和復用,而不再像以前那樣“牽一處而動全身”了。
- 集中控制交互:多個同事對象的交互,被封裝在中介者對象里面集中管理,使得這些交互行為發生變化的時候,只需要修改中介者對象就可以了,當然如果是已經做好的系統,那么就擴展中介者對象,而各個同事類不需要做修改。
- 一對多關聯轉變為一對一的關聯:沒有使用中介者模式的時候,同事對象之間的關系通常是一對多的,引入中介者對象以后,中介者對象和同事對象的關系通常變成雙向的一對一,這會讓對象的關系更容易理解和實現。
# 中介者模式的缺點
- 當同事類太多時,中介者的職責將很大,它會變得復雜而龐大,以至于系統難以維護。
二、中介者模式 Demo
1、Demo 設計
現在租房基本都是通過房屋中介,房主將房屋托管給房屋中介,而租房者從房屋中介獲取房屋信息。房屋中介充當租房者與房屋所有者之間的中介者。
2、Demo 實現
# Mediator 抽象中介者接口角色
public abstract class Mediator {/*** 申明一個聯絡方法** @param message String* @param person Person*/public abstract void constact(String message, Person person);
}
# Person 抽象同事類(Colleague)角色
public abstract class Person {protected String name;protected Mediator mediator;public Person(String name, Mediator mediator) {this.name = name;this.mediator = mediator;}
}
# HouseOwner 具體同事類(Concrete Colleague)角色
public class HouseOwner extends Person {public HouseOwner(String name, Mediator mediator) {super(name, mediator);}/*** 與中介者聯系** @param message String*/public void constact(String message) {mediator.constact(message, this);}/*** 獲取信息** @param message String*/public void getMessage(String message) {System.out.println("房主" + name + "獲取到的信息:" + message);}
}
public class Tenant extends Person {public Tenant(String name, Mediator mediator) {super(name, mediator);}/*** 與中介者聯系** @param message String*/public void constact(String message) {mediator.constact(message, this);}//獲取信息public void getMessage(String message) {System.out.println("租房者" + name + "獲取到的信息:" + message);}
}
# MediatorStructure 具體中介者(ConcreteMediator)角色
public class MediatorStructure extends Mediator {/*** 首先中介結構必須知道所有房主和租房者的信息*/private HouseOwner houseOwner;private Tenant tenant;public HouseOwner getHouseOwner() {return houseOwner;}public void setHouseOwner(HouseOwner houseOwner) {this.houseOwner = houseOwner;}public Tenant getTenant() {return tenant;}public void setTenant(Tenant tenant) {this.tenant = tenant;}@Overridepublic void constact(String message, Person person) {//如果是房主,則租房者獲得信息if (person == houseOwner) { tenant.getMessage(message);} else { //反正則是房主獲得信息houseOwner.getMessage(message);}}
}
3、Demo 測試
public class Client {public static void main(String[] args) {//一個房主、一個租房者、一個中介機構MediatorStructure mediator = new MediatorStructure();//房主和租房者只需要知道中介機構即可HouseOwner houseOwner = new HouseOwner("張三", mediator);Tenant tenant = new Tenant("李四", mediator);//中介結構要知道房主和租房者mediator.setHouseOwner(houseOwner);mediator.setTenant(tenant);tenant.constact("需要租三室的房子");houseOwner.constact("我這有三室的房子,你需要租嗎?");}
}