大話設計模式—中介者模式
中介者模式(Mediator Pattern)是用來減少多個對象和類之間的通信復雜性。
這種模式提供了一個中介類,該類通常處理不同類之間的通信,並支持松耦合。使代碼易於維護。
中介者模式屬於行為型模式。
引言:
雖然一個系統切割成很多對象通常能夠添加其可復用性。可是對象間相互連接次數的添加又會減少其可復用性;大量的連接使得一個對象不可能在沒有其它對象的支持下工作。系統表現為一個不可切割的總體,所以,對系統的行為進行不論什麽較大的修改就十分困難了。
要解決這種問題。我們能夠使用 迪米特原則 ,假設兩個類不必彼此直接通信,那麽這兩個類就不應當發生直接的相互作用。假設須要相互調用,能夠通過第三方來轉發。
通過中介者對象,能夠將系統的網狀結構變成以中介者為中心的星型結構,每一個詳細對象不再通過直接的聯系與還有一個詳細對象進行通信,而是通過中介者對象。中介者對象的設計使得系統的結構不會由於新對象的引入而造成大量的修改工作。
例如以下圖聯合國與各個國家的關系就是一個非常貼切的樣例:
大話設計模式中程傑老師給出的定義是:
中介者模式。用一個中介對象來封裝一系列的對象交互。中介者使各對象不須要顯示的相互引用,從而使其耦合松散,並且能夠獨立的改變他們之間的交互。
代碼實例:
抽象中介者
public abstract class Mediator{
/**
* 定義一個抽象的發送消息方法
* 功能:得到同事對象和發送消息
*/
public abstract void Send(String message,Colleague colleague);
}
抽象同事類
public abstract classColleague{
protected Mediator mediator;
//構造方法,得到中介者對象
public Colleague(){
this.mediator = mediator;
}
}
中介者實現類
public class ConcreteMediator implements Mediator{
private ConcreteMediatorA colleagueA;
private ConcreteMediaorB colleagueB;
//setter and getter
//重寫發送消息的方法,依據詳細發送消息的對象去通知接收消息的對象
public void send(String message,Colleague colleague){
if(colleague == colleagueA){
colleagueB.notify(message);
}
colleagueA.notify(message);
}
}
同事對象實現類A
public class ConcreteColleagueA implements Colleague{
public ConcreteColleagueA(Mediator mediator){
this.mediator = mediator;
}
public void send(String message){
//消息是通過中介者發送出去的
mediator.send(message,this.concreteColleagueA);
}
public void notify(String message){
Systen.out.println("A同事收到消息:" + message);
}
}
同事對象實現類B
public class ConcreteColleagueB implements Colleague{
public ConcreteColleagueB(Mediator mediator){
this.mediator = mediator;
}
public void send(String message){
//消息是通過中介者發送出去的
mediator.send(message,this.concreteColleagueB);
}
public void notify(String message){
Systen.out.println("B同事收到消息:" + message);
}
}
測試類
public static void main(String[] args){
ConcreteMediator mediator = new ConcreteMediator();
//讓兩個詳細同事類對象認識中介者對象
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
mediator.colleagueA = colleagueA;
mediator.colleagueB = colleagueB;
colleagueA.send("hi,nice to meet you!");
colleagueB.send("nice to meet you too!");
}
執行結果:
B同事收到消息:hi,nice to meet you!
A同事收到消息:nice to meet you too!
長處:
1、減少了類的復雜度,將一對多轉化成了一對一。
2、各個類之間的解耦。
3、符合迪米特原則。
缺點:中介者會龐大。變得復雜難以維護。
使用場景:
1、系統中對象之間存在比較復雜的引用關系,導致它們之間的依賴關系結構混亂並且難以復用該對象。
2、想通過一個中間類來封裝多個類中的行為。而又不想生成太多的子類。
註意事項:不應當在職責混亂的時候使用。
中介者模式的長處來自於集中控制,其缺點也是(中介者對象必須知道全部的同事對象),使用時要考慮清楚。
大話設計模式—中介者模式