摘要:在地球上最大的中介者就是聯(lián)合國(guó)了,它主要用來維護(hù)國(guó)際和平與安全解決國(guó)際間經(jīng)濟(jì)社會(huì)文化和人道主義性質(zhì)的問題。所以對(duì)于關(guān)系比較復(fù)雜的系統(tǒng),我們?yōu)榱藴p少對(duì)象之間的關(guān)聯(lián)關(guān)系,使之成為一個(gè)松耦合系統(tǒng),我們就需要使用中介者模式。
概述中介者模式(Mediator Pattern)屬于行為型模式的一種,用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
在我們的生活中處處充斥著中介者,比如租房、買房、出國(guó)留學(xué)、找工作、旅游等等可能都需要那些中介者的幫助,同時(shí)我們也深受其害,高昂的中介費(fèi),虛假信息。在地球上最大的中介者就是聯(lián)合國(guó)了,它主要用來維護(hù)國(guó)際和平與安全、解決國(guó)際間經(jīng)濟(jì)、社會(huì)、文化和人道主義性質(zhì)的問題。國(guó)與國(guó)之間的關(guān)系異常復(fù)雜,會(huì)因?yàn)楦鞣N各樣的利益關(guān)系來結(jié)成盟友或者敵人,熟話說沒有永遠(yuǎn)的朋友,也沒有永遠(yuǎn)的敵人,只有永遠(yuǎn)的利益!所以國(guó)與國(guó)之間的關(guān)系同樣會(huì)隨著時(shí)間、環(huán)境因?yàn)槔娑l(fā)生改變。在我們軟件的世界也同樣如此,對(duì)象與對(duì)象之間存在著很強(qiáng)、復(fù)雜的關(guān)聯(lián)關(guān)系,如果沒有類似于聯(lián)合國(guó)這樣的“機(jī)構(gòu)”會(huì)很容易出問題的,譬如:
1、 對(duì)象與對(duì)象之間存在大量的關(guān)聯(lián)關(guān)系,這樣勢(shì)必會(huì)導(dǎo)致系統(tǒng)的結(jié)構(gòu)變得很復(fù)雜,同時(shí)若一個(gè)對(duì)象發(fā)生改變,我們也需要跟蹤與之相關(guān)聯(lián)的對(duì)象,同時(shí)做出相應(yīng)的處理。
2、 對(duì)象之間的連接增加會(huì)導(dǎo)致對(duì)象可復(fù)用性降低。
3、 系統(tǒng)的可擴(kuò)展性低。增加一個(gè)新的對(duì)象,我們需要在其相關(guān)連的對(duì)象上面加上引用,這樣就會(huì)導(dǎo)致系統(tǒng)的耦合性增高,使系統(tǒng)的靈活性和可擴(kuò)展都降低。
在前面我就知道如果兩個(gè)類不必彼此通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接關(guān)聯(lián)的關(guān)系。如果其中一個(gè)類需要調(diào)用另一個(gè)類中的方法,我們可以通過第三方來轉(zhuǎn)發(fā)這個(gè)調(diào)用。所以對(duì)于關(guān)系比較復(fù)雜的系統(tǒng),我們?yōu)榱藴p少對(duì)象之間的關(guān)聯(lián)關(guān)系,使之成為一個(gè)松耦合系統(tǒng),我們就需要使用中介者模式。
通過中介者模式,我們可以將復(fù)雜關(guān)系的網(wǎng)狀結(jié)構(gòu)變成結(jié)構(gòu)簡(jiǎn)單的以中介者為核心的星形結(jié)構(gòu),每個(gè)對(duì)象不再和它與之關(guān)聯(lián)的對(duì)象直接發(fā)生相互作用,而是通過中介者對(duì)象來另一個(gè)對(duì)象發(fā)生相互作用。
UML結(jié)構(gòu)圖
模式結(jié)構(gòu)
Mediator(抽象中介者): 定義了同事對(duì)象到中介者對(duì)象之間的接口
ConcreteMediator(具體中介者): 實(shí)現(xiàn)抽象中介者的方法,它需要知道所有的具體同事類,同時(shí)需要從具體的同事類那里接收信息,并且向具體的同事類發(fā)送信息。
Colleague(抽象同事類): 它定義各個(gè)同事類公有的方法,并聲明了一些抽象方法來供子類實(shí)現(xiàn),同時(shí)維持了一個(gè)對(duì)抽象中介者類的引用,其子類可以通過該引用來與中介者通信。
ConcreteColleague(具體同事類): 抽象同事類的子類;每個(gè)同事對(duì)象在與其他同事對(duì)象通信時(shí),先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實(shí)現(xiàn)了在抽象同事類中聲明的抽象方法。
案例以租房為例,這里中介機(jī)構(gòu)充當(dāng)租房者與房屋所有者之間的中介者。UML結(jié)構(gòu)圖:
UML圖如下:
1.定義抽象中介者
interface Mediator { /** * 讓對(duì)象之間通訊 * @param content 傳遞的內(nèi)容 * @param person 傳遞的對(duì)象 */ void contact(String content, AbstractPerson person); }
2.定義抽象同事類AbstractPerson
abstract class AbstractPerson { protected String name; protected Mediator mediator; AbstractPerson(String name, Mediator mediator) { this.name = name; this.mediator = mediator; } public abstract void receiveMessage(String msg); }
3.分別定義房東和租客類,繼承抽象同事類
class HouseOwner extends AbstractPerson { HouseOwner(String name, Mediator mediator) { super(name, mediator); } public void contact(String message) { mediator.contact(message, this); } @Override public void receiveMessage(String message) { System.out.println("房主:" + name + ",獲得信息:" + message); } } class Tenant extends AbstractPerson { Tenant(String name, Mediator mediator) { super(name, mediator); } public void contact(String message) { mediator.contact(message, this); } @Override public void receiveMessage(String message) { System.out.println("租客:" + name + ",獲得信息:" + message); } }
4.創(chuàng)建具體中介者,抽象的實(shí)現(xiàn),用來協(xié)調(diào)各個(gè)同事之間調(diào)用
class MediatorStructure implements 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; } @Override public void contact(String message, AbstractPerson person) { //如果是房主,則租房者獲得信息 if (person == houseOwner) { tenant.receiveMessage(message); } else { //反正則是房主獲得信息 houseOwner.receiveMessage(message); } } }
5.創(chuàng)建客戶端測(cè)試
public class Client { public static void main(String[] args) { //一個(gè)房主、一個(gè)租房者、一個(gè)中介機(jī)構(gòu) MediatorStructure mediator = new MediatorStructure(); HouseOwner owner = new HouseOwner("小唐", mediator); Tenant tenant = new Tenant("小李", mediator); mediator.setHouseOwner(owner); mediator.setTenant(tenant); tenant.contact("房東您好,請(qǐng)問還有三室兩廳出粗嗎....."); owner.contact("還有!你需要租嗎?"); } }
6.運(yùn)行結(jié)果
房主:小唐,獲得信息:房東您好,請(qǐng)問還有三室兩廳出粗嗎..... 租客:小李,獲得信息:還有!你需要租嗎?總結(jié)
在中介者模式中通過引用中介者對(duì)象,將系統(tǒng)中有關(guān)的對(duì)象所引用的其他對(duì)象數(shù)目減少到最少。它簡(jiǎn)化了系統(tǒng)的結(jié)構(gòu),將系統(tǒng)由負(fù)責(zé)的網(wǎng)狀結(jié)構(gòu)轉(zhuǎn)變成簡(jiǎn)單的星形結(jié)構(gòu),中介者對(duì)象在這里起到中轉(zhuǎn)和協(xié)調(diào)作用。
中介者類是中介者模式的核心,它對(duì)整個(gè)系統(tǒng)進(jìn)行控制和協(xié)調(diào),簡(jiǎn)化了對(duì)象之間的交互,還可以對(duì)對(duì)象間的交互進(jìn)行進(jìn)一步的控制。
通過使用中介者模式,具體的同事類可以獨(dú)立變化,通過引用中介者可以簡(jiǎn)化同事類的設(shè)計(jì)和實(shí)現(xiàn)。
就是由于中介者對(duì)象需要知道所有的具體同事類,封裝具體同事類之間相互關(guān)系,導(dǎo)致中介者對(duì)象變得非常復(fù)雜,系統(tǒng)維護(hù)起來較為困難。
優(yōu)點(diǎn)
簡(jiǎn)化了對(duì)象之間的關(guān)系,將系統(tǒng)的各個(gè)對(duì)象之間的相互關(guān)系進(jìn)行封裝,將各個(gè)同事類解耦,使系統(tǒng)成為松耦合系統(tǒng)。
減少了子類的生成。
減少各同事類的設(shè)計(jì)與實(shí)現(xiàn)。
缺點(diǎn)
中介者會(huì)龐大,變得復(fù)雜難以維護(hù)。
JDK中應(yīng)用Mediator模式在事件驅(qū)動(dòng)類應(yīng)用中比較多,例如聊天、消息傳遞等等,需要有一個(gè)MessageMediator,專門負(fù)責(zé)request/reponse之間任務(wù)的調(diào)節(jié)。
JDK的具體應(yīng)用:
- java.util.Timer - java.util.concurrent.Executor#execute() - java.util.concurrent.ExecutorService#submit() - java.lang.reflect.Method#invoke()說點(diǎn)什么
參考文獻(xiàn):http://www.cnblogs.com/JsonShare/p/7263876.html
全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter15/battcn-mediator
個(gè)人QQ:1837307557
battcn開源群(適合新手):391619659
微信公眾號(hào):battcn(歡迎調(diào)戲)
福利關(guān)注公眾號(hào):battcn,回復(fù)springboot即可獲得
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70715.html
摘要:觀察者模式是一種使用頻率非常高的設(shè)計(jì)模式,無論是移動(dòng)應(yīng)用應(yīng)用或者桌面應(yīng)用,觀察者模式幾乎無處不在,它為實(shí)現(xiàn)對(duì)象之間的聯(lián)動(dòng)提供了一套完整的解決方案,凡是涉及到一對(duì)一或者一對(duì)多的對(duì)象交互場(chǎng)景都可以使用觀察者模式。 觀察者模式(Observer Pattern)屬于對(duì)象行為型模式的一種,定義對(duì)象之間的一種一對(duì)多依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新。 ...
摘要:用專業(yè)的話來講設(shè)計(jì)模式是一套被反復(fù)使用多數(shù)人知曉的經(jīng)過分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。工廠方法模式的擴(kuò)展性非常優(yōu)秀。工廠方法模式是典型的解耦框架。 前言 最近一直在Java方向奮斗《終于,我還是下決心學(xué)Java后臺(tái)了》,今天抽空開始學(xué)習(xí)Java的設(shè)計(jì)模式了。計(jì)劃有時(shí)間就去學(xué)習(xí),你這么有時(shí)間,還不來一起上車嗎? 之所以要學(xué)...
摘要:本文只是尋找設(shè)計(jì)模式在中的應(yīng)用。來補(bǔ)全這一塊工廠模式中的應(yīng)用包線程池解釋和代碼線程池中有線程創(chuàng)建工廠。狀態(tài)模式中的應(yīng)用解釋和代碼根據(jù)一個(gè)指針的狀態(tài)而改變自己的行為適配器模式中的應(yīng)用解釋和代碼將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 前言 最近重學(xué)設(shè)計(jì)模式,而且還有很多源碼要看。所以就想一舉兩得。從源碼中尋找設(shè)計(jì)模式。順便還可以看看源碼。。。本文只是尋找設(shè)計(jì)模式在java中的應(yīng)用。優(yōu)...
摘要:好,師傅我們要學(xué)習(xí)帝吧人民,進(jìn)能打,退能刷淘寶。恩,大致過程就是這樣,我們使用中介者模式想一想。首先,數(shù)據(jù)需要放在中介者模式內(nèi),用戶的一切操作,都會(huì)傳遞給中介者模式,由他來選擇是哪一個(gè)部分發(fā)生改變。 俗話說,一個(gè)模式三個(gè)坑。 中介者模式應(yīng)該算最坑的一個(gè)模式,坑不在于他的原理。而在于他的名字和其他模式的使用,真尼瑪像。首先,中介者 好像是一切模式里面都有的一個(gè)東西,比如,享元模式中-元對(duì)...
閱讀 2567·2021-11-22 12:05
閱讀 3453·2021-10-14 09:42
閱讀 1686·2021-07-28 00:15
閱讀 1989·2019-08-30 11:08
閱讀 1487·2019-08-29 17:31
閱讀 932·2019-08-29 16:42
閱讀 2340·2019-08-26 11:55
閱讀 2119·2019-08-26 11:49