中介者模式
中介者模式(Mediator)夷家,用一個中介對象來封裝一系列的對象交互靶累。中介者使各對象不需要顯式地相互引用,從而使其耦合松散骂澄,而且可以獨立地改變它們之間的交互吓蘑。[DP]
中介者模式結(jié)構(gòu)圖
圖片.png
Mediator類,抽象中介者類
public abstract class Mediator {
/**
* 定義一個抽象的發(fā)送消息方法
* 得到同事對象和發(fā)送消息
* @param message
* @param colleague
*/
public abstract void send(String message,Colleague colleague);
}
Colleague類坟冲,抽象同事類
public abstract class Colleague {
protected Mediator mediator;
/**
* 構(gòu)造方法磨镶,得到中介者對象
* @param mediator
*/
public Colleague(Mediator mediator){
this.mediator = mediator;
}
}
ConcreteMediator類,具體中介者類
public class ConcreteMediator extends Mediator {
/**
* 需要了解所有的具體同事對象
*/
private ConcreteColleague1 concreteColleague1;
private ConcreteColleague2 concreteColleague2;
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
@Override
public void send(String message, Colleague colleague) {
//重寫發(fā)送信息的方法樱衷,根據(jù)對象做出選擇判斷棋嘲,通知對象
if(colleague == concreteColleague1){
concreteColleague2.notify(message);
}else {
concreteColleague1.notify(message);
}
}
}
具體同事類
public class ConcreteColleague1 extends Colleague {
/**
* 構(gòu)造方法,得到中介者對象
*
* @param mediator
*/
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
/**
* 發(fā)送信息時通常是中介者發(fā)送的
* @param message
*/
public void send(String message) {
mediator.send(message, this);
}
public void notify(String message) {
print("同事1得到消息:" + message);
}
}
public class ConcreteColleague2 extends Colleague {
/**
* 構(gòu)造方法矩桂,得到中介者對象
*
* @param mediator
*/
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void send(String message) {
mediator.send(message, this);
}
public void notify(String message) {
print("同事2得到消息:" + message);
}
}
客戶端調(diào)用
public class Test {
public static void main(String[] args){
ConcreteMediator mediator = new ConcreteMediator();
//讓兩個具體同事類認識中介者對象
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
//讓中介者認識各個具體同事類對象
mediator.setConcreteColleague1(concreteColleague1);
mediator.setConcreteColleague2(concreteColleague2);
//具體同事類對象的發(fā)送信息都是通過中介者轉(zhuǎn)發(fā)
concreteColleague1.send("吃飯了嗎");
concreteColleague2.send("沒呢");
}
}
運行結(jié)果
圖片.png
中介者模式優(yōu)缺點
中介者模式很容易在系統(tǒng)中應(yīng)用沸移,也很容易在系統(tǒng)中誤用痪伦。當(dāng)系統(tǒng)出現(xiàn)了‘多對多’交互復(fù)雜的對象群時,不要急于使用中介者模式雹锣,而要先反思你的系統(tǒng)在設(shè)計上是不是合理网沾。
中介者模式的優(yōu)點首先是Mediator的出現(xiàn)減少了各個Colleague的耦合,使得可以獨立地改變和復(fù)用各個Colleague類和Mediator蕊爵。其次辉哥,由于把對象如何協(xié)作進行了抽象,將中介作為一個獨立的概念并將其封裝在一個對象中攒射,這樣關(guān)注的對象就從對象各自本身的行為轉(zhuǎn)移到它們之間的交互上來醋旦,也就是站在一個更宏觀的角度去看待系統(tǒng)。
由于ConcreteMediator控制了集中化会放,于是就把交互復(fù)雜性變?yōu)榱酥薪檎叩膹?fù)雜性饲齐,這就使得中介者會變得比任何一個ConcreteColleague都復(fù)雜。
中介者模式一般應(yīng)用于一組對象以定義良好但是復(fù)雜的方式進行通信的場合咧最,以及想定制一個分布在多個類中的行為捂人,而又不想生成太多的子類的場合。