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