Java設計模式之中介模式
一、介紹
中介模式(Mediator Pattern),屬于行為型設計模式。目的是把系統(tǒng)中對象之間的調用關系從一對多轉變成一對一的調用關系,以此來降低多個對象和類之間的通信復雜性。
在很多情況下,一個類中對象于對象之間的調用往往很容易形成網狀結構,此時倘若一個對象發(fā)生改變,那么將會導致其他所有與之關聯(lián)的對象進行修改,從而導致系統(tǒng)復雜性增加,且難以維護。
使用中介模式,可以通過向系統(tǒng)中引入中介類,將這種網狀結構改為星型結構,各個對象直接不直接關聯(lián)而是通過該中介類進行交互,當一個對象發(fā)生改變時,只需要在中介類中做出相應的修改即可,其他對象對此變化是無感的。
用一個中介對象來封裝一系列的對象交互。中介者使各個對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
使用下面圖示可能會更好的進行表達

二、生活中的中介模式
在我們日常生活中,處處存在中介模式的影子。
房產中介
如果沒有房產中介,我們需要親自聯(lián)系各個房東約其看房,既浪費自己的時間也浪費各個房東的時間;
有了房產中介,我們只需要聯(lián)系中介小哥就行了,中介小哥有各個房東的鑰匙,直接看房,十分方便。
線上招聘平臺
在沒有線上招聘平臺的情況下,我們要找一家公司應聘是一件十分麻煩的事情,要么親自帶著簡歷去公司詢問是否招聘某崗位(可能因為不招人而白跑一趟),要么在網上查找各個公司的官網招聘頁以郵箱的形式投遞簡歷,但甚至很多小公司都沒有官網;
有了線上招聘平臺后,應聘者直接在平臺上聯(lián)系各個公司就好了,通過該平臺,應聘者不僅可以看到各種大中小公司,還不會因為公司招聘流程的改變而受影響,因為應聘者在平臺上的操作都是一樣的。
三、中介模式中的角色
在中介模式中,最重要的角色就是**中介角色(Mediator )**了,它用于在系統(tǒng)中各個對象之間建立關聯(lián)關系。
抽象中介接口類(Mediator)
定義中介的功能。
具體中介類(MediatorImpl)
實現(xiàn)中介接口類定義的功能。在實現(xiàn)的功能邏輯中,給各個對象建立關聯(lián)關系,因此中介類中需要維護一個包含關聯(lián)的各個組件的集合并對該集合進行維護。
系統(tǒng)組件抽象接口類(Component)
定義系統(tǒng)中各個對象的功能。
系統(tǒng)組件具體實現(xiàn)類(AComponent、BComponent、CComponent)
實現(xiàn)各個對象的功能。
通過對中介模式中各個角色的分析,可得其通用UM圖如下所示

四、案例演示
以群發(fā)消息為例,每當我們在重大傳統(tǒng)節(jié)日時,許多人喜歡使用短信群發(fā)的形式,將節(jié)日祝福一次性群發(fā)給他的親朋好友們。這是一個非常好的案例,在沒有群發(fā)功能的時候,我們想好一段祝福語后,需要一個接一個地對通訊錄中的朋友進行發(fā)送短信(一對多);而后來有了群發(fā)功能后,我們選擇群發(fā)功能,將親朋好友都添加到這個功能中作為群發(fā)聯(lián)系人,然后點擊發(fā)送短信就可以將祝福發(fā)送給所有人了(一對一)。此時群發(fā)功能就相當于中介。
1. 角色分析
聯(lián)系人接口(Friend)
定義聯(lián)系人的功能。在節(jié)日祝福中,我們通訊錄中的聯(lián)系人有個接收短信功能receiveMessage()就夠了。
public interface Friend {
void receiveMessage(String message);
}
具體聯(lián)系人(FriendImpl)
實現(xiàn)聯(lián)系人接口(Friend)定義的功能。假設聯(lián)系人有三個:父親、母親、姐姐。
public class Father implements Friend{
@Override
public void receiveMessage(String message) {
System.out.println("父親收到短信:" + message);
}
}
public class Mother implements Friend{
@Override
public void receiveMessage(String message) {
System.out.println("母親收到短信:" + message);
}
}
public class Sister implements Friend{
@Override
public void receiveMessage(String message) {
System.out.println("姐姐收到短信:" + message);
}
}抽象群發(fā)接口(SendGroup)
定義一個發(fā)送功能send(),以及對群發(fā)目標聯(lián)系人的維護功能addFriend()、removeFriend()。
public interface SendGroup {
void addFriend(Friend friend);
void removeFriend(Friend friend);
void send(String message);
}具體群發(fā)中介類(SendGroupImpl)
實現(xiàn)抽象群發(fā)接口SendGroup定義的功能。前面分析中說過,中介類中需要維護一個包含所有聯(lián)系人的集合并對其進行維護。
public class SendGroupImpl implements SendGroup{
private final List<Friend> friendList = new ArrayList<>();
@Override
public void addFriend(Friend friend) {
if (!friendList.contains(friend)) {
friendList.add(friend);
}
}
@Override
public void removeFriend(Friend friend) {
friendList.remove(friend);
}
@Override
public void send(String message) {
for (Friend friend : friendList) {
friend.receiveMessage(message);
}
}
}客戶端(MediatorClient)
新建一個客戶端類對該案例進行演示
public class MediatorClient {
public static void main(String[] args) {
Friend father = new Father();
Friend mother = new Mother();
Friend sister = new Sister();
// 選擇需要群發(fā)短信的聯(lián)系人
SendGroup sendGroup = new SendGroupImpl();
sendGroup.addFriend(father);
sendGroup.addFriend(mother);
sendGroup.addFriend(sister);
// 群發(fā)短信
sendGroup.send("新年快樂");
}
}運行該代碼后得到以下輸出

五、優(yōu)缺點
優(yōu)點:
- 通過引入中介類,將對象之間的關系從一對多變成了一對一
- 將各個類進行解耦
缺點:
對客戶端的代碼維護,轉變?yōu)閷χ薪轭惖木S護,中介類變得龐大時也將同樣難以維護。
到此這篇關于Java設計模式之中介模式的文章就介紹到這了,更多相關Java中介模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring無法讀取properties文件數(shù)據(jù)問題詳解
這篇文章主要介紹了spring無法讀取properties文件數(shù)據(jù)問題詳解,需要的朋友可以參考下2020-02-02
springboot schedule 解決定時任務不執(zhí)行的問題
這篇文章主要介紹了springboot schedule 解決定時任務不執(zhí)行的問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
SpringBoot實現(xiàn)動態(tài)多線程并發(fā)定時任務
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)動態(tài)多線程并發(fā)定時任務,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05

