Java設(shè)計(jì)模式之中介模式
一、介紹
中介模式(Mediator Pattern),屬于行為型設(shè)計(jì)模式。目的是把系統(tǒng)中對(duì)象之間的調(diào)用關(guān)系從一對(duì)多轉(zhuǎn)變成一對(duì)一的調(diào)用關(guān)系,以此來(lái)降低多個(gè)對(duì)象和類(lèi)之間的通信復(fù)雜性。
在很多情況下,一個(gè)類(lèi)中對(duì)象于對(duì)象之間的調(diào)用往往很容易形成網(wǎng)狀結(jié)構(gòu),此時(shí)倘若一個(gè)對(duì)象發(fā)生改變,那么將會(huì)導(dǎo)致其他所有與之關(guān)聯(lián)的對(duì)象進(jìn)行修改,從而導(dǎo)致系統(tǒng)復(fù)雜性增加,且難以維護(hù)。
使用中介模式,可以通過(guò)向系統(tǒng)中引入中介類(lèi),將這種網(wǎng)狀結(jié)構(gòu)改為星型結(jié)構(gòu),各個(gè)對(duì)象直接不直接關(guān)聯(lián)而是通過(guò)該中介類(lèi)進(jìn)行交互,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),只需要在中介類(lèi)中做出相應(yīng)的修改即可,其他對(duì)象對(duì)此變化是無(wú)感的。
用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各個(gè)對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
使用下面圖示可能會(huì)更好的進(jìn)行表達(dá)
二、生活中的中介模式
在我們?nèi)粘I钪校幪幋嬖谥薪槟J降挠白印?/p>
房產(chǎn)中介
如果沒(méi)有房產(chǎn)中介,我們需要親自聯(lián)系各個(gè)房東約其看房,既浪費(fèi)自己的時(shí)間也浪費(fèi)各個(gè)房東的時(shí)間;
有了房產(chǎn)中介,我們只需要聯(lián)系中介小哥就行了,中介小哥有各個(gè)房東的鑰匙,直接看房,十分方便。
線(xiàn)上招聘平臺(tái)
在沒(méi)有線(xiàn)上招聘平臺(tái)的情況下,我們要找一家公司應(yīng)聘是一件十分麻煩的事情,要么親自帶著簡(jiǎn)歷去公司詢(xún)問(wèn)是否招聘某崗位(可能因?yàn)椴徽腥硕着芤惶?,要么在網(wǎng)上查找各個(gè)公司的官網(wǎng)招聘頁(yè)以郵箱的形式投遞簡(jiǎn)歷,但甚至很多小公司都沒(méi)有官網(wǎng);
有了線(xiàn)上招聘平臺(tái)后,應(yīng)聘者直接在平臺(tái)上聯(lián)系各個(gè)公司就好了,通過(guò)該平臺(tái),應(yīng)聘者不僅可以看到各種大中小公司,還不會(huì)因?yàn)楣菊衅噶鞒痰母淖兌苡绊?,因?yàn)閼?yīng)聘者在平臺(tái)上的操作都是一樣的。
三、中介模式中的角色
在中介模式中,最重要的角色就是**中介角色(Mediator )**了,它用于在系統(tǒng)中各個(gè)對(duì)象之間建立關(guān)聯(lián)關(guān)系。
抽象中介接口類(lèi)(Mediator)
定義中介的功能。
具體中介類(lèi)(MediatorImpl)
實(shí)現(xiàn)中介接口類(lèi)定義的功能。在實(shí)現(xiàn)的功能邏輯中,給各個(gè)對(duì)象建立關(guān)聯(lián)關(guān)系,因此中介類(lèi)中需要維護(hù)一個(gè)包含關(guān)聯(lián)的各個(gè)組件的集合并對(duì)該集合進(jìn)行維護(hù)。
系統(tǒng)組件抽象接口類(lèi)(Component)
定義系統(tǒng)中各個(gè)對(duì)象的功能。
系統(tǒng)組件具體實(shí)現(xiàn)類(lèi)(AComponent、BComponent、CComponent)
實(shí)現(xiàn)各個(gè)對(duì)象的功能。
通過(guò)對(duì)中介模式中各個(gè)角色的分析,可得其通用UM圖如下所示
四、案例演示
以群發(fā)消息為例,每當(dāng)我們?cè)谥卮髠鹘y(tǒng)節(jié)日時(shí),許多人喜歡使用短信群發(fā)的形式,將節(jié)日祝福一次性群發(fā)給他的親朋好友們。這是一個(gè)非常好的案例,在沒(méi)有群發(fā)功能的時(shí)候,我們想好一段祝福語(yǔ)后,需要一個(gè)接一個(gè)地對(duì)通訊錄中的朋友進(jìn)行發(fā)送短信(一對(duì)多);而后來(lái)有了群發(fā)功能后,我們選擇群發(fā)功能,將親朋好友都添加到這個(gè)功能中作為群發(fā)聯(lián)系人,然后點(diǎn)擊發(fā)送短信就可以將祝福發(fā)送給所有人了(一對(duì)一)。此時(shí)群發(fā)功能就相當(dāng)于中介。
1. 角色分析
聯(lián)系人接口(Friend)
定義聯(lián)系人的功能。在節(jié)日祝福中,我們通訊錄中的聯(lián)系人有個(gè)接收短信功能receiveMessage()就夠了。
public interface Friend { void receiveMessage(String message); }
具體聯(lián)系人(FriendImpl)
實(shí)現(xiàn)聯(lián)系人接口(Friend)定義的功能。假設(shè)聯(lián)系人有三個(gè):父親、母親、姐姐。
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)
定義一個(gè)發(fā)送功能send(),以及對(duì)群發(fā)目標(biāo)聯(lián)系人的維護(hù)功能addFriend()、removeFriend()。
public interface SendGroup { void addFriend(Friend friend); void removeFriend(Friend friend); void send(String message); }
具體群發(fā)中介類(lèi)(SendGroupImpl)
實(shí)現(xiàn)抽象群發(fā)接口SendGroup定義的功能。前面分析中說(shuō)過(guò),中介類(lèi)中需要維護(hù)一個(gè)包含所有聯(lián)系人的集合并對(duì)其進(jìn)行維護(hù)。
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); } } }
客戶(hù)端(MediatorClient)
新建一個(gè)客戶(hù)端類(lèi)對(duì)該案例進(jìn)行演示
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("新年快樂(lè)"); } }
運(yùn)行該代碼后得到以下輸出
五、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 通過(guò)引入中介類(lèi),將對(duì)象之間的關(guān)系從一對(duì)多變成了一對(duì)一
- 將各個(gè)類(lèi)進(jìn)行解耦
缺點(diǎn):
對(duì)客戶(hù)端的代碼維護(hù),轉(zhuǎn)變?yōu)閷?duì)中介類(lèi)的維護(hù),中介類(lèi)變得龐大時(shí)也將同樣難以維護(hù)。
到此這篇關(guān)于Java設(shè)計(jì)模式之中介模式的文章就介紹到這了,更多相關(guān)Java中介模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談SpringMVC+Spring3+Hibernate4開(kāi)發(fā)環(huán)境搭建
MVC已經(jīng)是現(xiàn)代Web開(kāi)發(fā)中的一個(gè)很重要的部分,本文介紹一下SpringMVC+Spring3+Hibernate4的開(kāi)發(fā)環(huán)境搭建,有興趣的可以了解一下。2017-01-01JPA配置方式+逆向工程映射到Entity實(shí)體類(lèi)
這篇文章主要介紹了JPA配置方式+逆向工程映射到Entity實(shí)體類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式
這篇文章主要介紹了idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java實(shí)現(xiàn)數(shù)字轉(zhuǎn)成英文的方法
這篇文章主要介紹了Java實(shí)現(xiàn)數(shù)字轉(zhuǎn)成英文的方法,涉及java數(shù)組與字符串的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05非常適合新手學(xué)生的Java線(xiàn)程池超詳細(xì)分析
作者是一個(gè)來(lái)自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請(qǐng)指正,將來(lái)會(huì)不斷的完善筆記,幫助更多的Java愛(ài)好者入門(mén)2022-03-03