Java設(shè)計模式之中介模式
一、介紹
中介模式(Mediator Pattern),屬于行為型設(shè)計模式。目的是把系統(tǒng)中對象之間的調(diào)用關(guān)系從一對多轉(zhuǎn)變成一對一的調(diào)用關(guān)系,以此來降低多個對象和類之間的通信復(fù)雜性。
在很多情況下,一個類中對象于對象之間的調(diào)用往往很容易形成網(wǎng)狀結(jié)構(gòu),此時倘若一個對象發(fā)生改變,那么將會導致其他所有與之關(guān)聯(lián)的對象進行修改,從而導致系統(tǒng)復(fù)雜性增加,且難以維護。
使用中介模式,可以通過向系統(tǒng)中引入中介類,將這種網(wǎng)狀結(jié)構(gòu)改為星型結(jié)構(gòu),各個對象直接不直接關(guān)聯(lián)而是通過該中介類進行交互,當一個對象發(fā)生改變時,只需要在中介類中做出相應(yīng)的修改即可,其他對象對此變化是無感的。
用一個中介對象來封裝一系列的對象交互。中介者使各個對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
使用下面圖示可能會更好的進行表達
二、生活中的中介模式
在我們?nèi)粘I钪?,處處存在中介模式的影子?/p>
房產(chǎn)中介
如果沒有房產(chǎn)中介,我們需要親自聯(lián)系各個房東約其看房,既浪費自己的時間也浪費各個房東的時間;
有了房產(chǎn)中介,我們只需要聯(lián)系中介小哥就行了,中介小哥有各個房東的鑰匙,直接看房,十分方便。
線上招聘平臺
在沒有線上招聘平臺的情況下,我們要找一家公司應(yīng)聘是一件十分麻煩的事情,要么親自帶著簡歷去公司詢問是否招聘某崗位(可能因為不招人而白跑一趟),要么在網(wǎng)上查找各個公司的官網(wǎng)招聘頁以郵箱的形式投遞簡歷,但甚至很多小公司都沒有官網(wǎng);
有了線上招聘平臺后,應(yīng)聘者直接在平臺上聯(lián)系各個公司就好了,通過該平臺,應(yīng)聘者不僅可以看到各種大中小公司,還不會因為公司招聘流程的改變而受影響,因為應(yīng)聘者在平臺上的操作都是一樣的。
三、中介模式中的角色
在中介模式中,最重要的角色就是**中介角色(Mediator )**了,它用于在系統(tǒng)中各個對象之間建立關(guān)聯(lián)關(guān)系。
抽象中介接口類(Mediator)
定義中介的功能。
具體中介類(MediatorImpl)
實現(xiàn)中介接口類定義的功能。在實現(xiàn)的功能邏輯中,給各個對象建立關(guān)聯(lián)關(guān)系,因此中介類中需要維護一個包含關(guā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)定義的功能。假設(shè)聯(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)點:
- 通過引入中介類,將對象之間的關(guān)系從一對多變成了一對一
- 將各個類進行解耦
缺點:
對客戶端的代碼維護,轉(zhuǎn)變?yōu)閷χ薪轭惖木S護,中介類變得龐大時也將同樣難以維護。
到此這篇關(guān)于Java設(shè)計模式之中介模式的文章就介紹到這了,更多相關(guān)Java中介模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談SpringMVC+Spring3+Hibernate4開發(fā)環(huán)境搭建
MVC已經(jīng)是現(xiàn)代Web開發(fā)中的一個很重要的部分,本文介紹一下SpringMVC+Spring3+Hibernate4的開發(fā)環(huán)境搭建,有興趣的可以了解一下。2017-01-01idea新建Springboot項目,設(shè)置默認maven和jdk版本方式
這篇文章主要介紹了idea新建Springboot項目,設(shè)置默認maven和jdk版本方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java實現(xiàn)數(shù)字轉(zhuǎn)成英文的方法
這篇文章主要介紹了Java實現(xiàn)數(shù)字轉(zhuǎn)成英文的方法,涉及java數(shù)組與字符串的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05