深入理解Java設計模式之中介者模式
一、什么是中介者模式
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
中介者作為一種行為設計模式,它公開一個統(tǒng)一的接口,系統(tǒng)的不同對象或組件可以通過該接口進行通信。增加一個中介者對象后,所有的相關(guān)對象通過中介者對象來通信,而不是互相引用,所以當一個對象發(fā)生改變時,只需要通知中介者對象即可。
二、中介者模式的結(jié)構(gòu)

Mediator:中介者接口。在里面定義各個同事之間交互需要的方法,可以是公共的通訊方法,比如changed方法,大家都用,也可以是小范圍的交互方法。
ConcreteMediator:具體中介者實現(xiàn)對象。它需要了解并維護各個同事對象,并負責具體的協(xié)調(diào)各同事對象的交互關(guān)系。
Colleague:同事類的定義,通常實現(xiàn)成為抽象類,主要負責約束同事對象的類型,并實現(xiàn)一些具體同事類之間的公共功能,比如:每個具體同事類都應該知道中介者對象,也就是具體同事類都會持有中介者對象,就可以定義到這個類里面。
ConcreteColleague:具體的同事類,實現(xiàn)自己的業(yè)務,在需要與其它同事通訊的時候,就與持有的中介者通信,中介者會負責與其它的同事交互。
三、中介者模式的優(yōu)缺點
優(yōu)點: 減少各個Colleague之間的耦合,使得可以獨立地改變和復用各個Colleague類和Mediator
缺點:中介者模式的缺點是顯而易見的,因為這個“中介“承擔了較多的責任,所以一旦這個中介對象出現(xiàn)了問題,那么整個系統(tǒng)就會受到重大的影響。
四、中介者模式的使用場景
1. 一組定義良好的對象,現(xiàn)在要進行復雜的通信。
2. 定制一個分布在多個類中的行為,而又不想生成太多的子類。
可以看出,中介對象主要是用來封裝行為的,行為的參與者就是那些對象,但是通過中介者,這些對象不用相互知道。
五、中介者模式與發(fā)布/訂閱模式的異同
1. 中介者模式與業(yè)務相關(guān),訂閱/發(fā)布模式與業(yè)務無關(guān)。
2. 兩個模式都有集中調(diào)度效果,對象之間不直接參與通信。
六、中介者模式的實現(xiàn)
安理會做中介
聯(lián)合國機構(gòu)類--Mediator類
//聯(lián)合國機構(gòu)
abstract class UnitedNations
{
//聲明
public abstract void Declare(string message, Country colleague);
}
國家類--Colleague類
//國家
abstract class Country
{
protected UnitedNations mediator;
public Country(UnitedNations mediator)
{
this.mediator = mediator;
}
}
美國類--ConcreteColleague類
//美國
class USA : Country
{
public USA(UnitedNations mediator) : base(mediator)
{
}
//聲明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//獲取消息
public void GetMessage(string message)
{
Console.WriteLine("美國獲得對方消息:" + message);
}
}
伊拉克類--ConcreteColleague類
//伊拉克
class Iraq : Country
{
public Iraq(UnitedNations mediator) : base(mediator)
{
}
//聲明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//獲取消息
public void GetMessage(string message)
{
Console.WriteLine("伊拉克獲得對方消息:" + message);
}
}
聯(lián)合國安理會--ConcreteMediator類
//聯(lián)合國安全理事會
class UnitedNationsSecurity : UnitedNations
{
private USA colleague1;
private Iraq colleague2;
//美國
public USA Colleague1 { set { colleague1 = value; } }
//伊拉克
public Iraq Colleague2 { set { colleague2 = value; } }
public override void Declare(string message, Country colleague)
{
if (colleague == colleague1)
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
客戶端代碼
class Program
{
//客戶端代碼
static void Main(string[] args)
{
UnitedNationsSecurity UNSC = new UnitedNationsSecurity();
USA c1 = new USA(UNSC);
Iraq c2 = new Iraq(UNSC);
UNSC.Colleague1 = c1;
UNSC.Colleague2 = c2;
c1.Declare("不準研發(fā)核武器,否則開戰(zhàn)");
c2.Declare("沒研發(fā),開戰(zhàn)就開戰(zhàn)");
Console.Read();
}
}
結(jié)果
伊拉克獲得對方消息:不準研發(fā)核武器,否則開戰(zhàn)
美國獲得對方消息:沒研發(fā),開戰(zhàn)就開戰(zhàn)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Mybatis返回類型為Map時遇到的類型轉(zhuǎn)化的異常問題
這篇文章主要介紹了Mybatis返回類型為Map時遇到的類型轉(zhuǎn)化的異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Springboot集成kafka高級應用實戰(zhàn)分享
這篇文章主要介紹了Springboot集成kafka高級應用實戰(zhàn)分享,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
詳解@ConditionalOnMissingBean注解的作用
這篇文章主要介紹了詳解@ConditionalOnMissingBean注解的作用,@ConditionalOnMissingBean,它是修飾bean的一個注解,主要實現(xiàn)的是,當你的bean被注冊之后,如果而注冊相同類型的bean,就不會成功,它會保證你的bean只有一個,需要的朋友可以參考下2023-10-10
Java實現(xiàn)支付寶之第三方支付寶即時到賬支付功能
這篇文章主要介紹了Java實現(xiàn)支付寶之第三方支付寶即時到賬支付功能的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
SpringBoot中實現(xiàn)@Scheduled動態(tài)定時任務
SpringBoot中的@Scheduled注解為定時任務提供了一種很簡單的實現(xiàn),本文主要介紹了SpringBoot中實現(xiàn)@Scheduled動態(tài)定時任務,具有一定的參考價值,感興趣的可以了解一下2024-01-01

