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