中介者模式(MEDIATOR),又稱調停者模式,通過使用一箇中介者對象來封裝一系列的對象交互,屬於對象行爲型模式。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。現實生活中,到處充斥着中介者模式的身影。上到莊嚴的法院,下到爲程序員帶來福音的婚姻介紹所或交友平臺,還有可惡的房產中介,都是中介者模式的體現。比如,你參加一個相親活動,20多對男女如飢似渴地尋找着自己的另一半。如果不是一見鍾情,你就需要了解20多個女生,不排除男生的話,就是40多個人的喜好,性格是否符合自己,這簡直就是災難!如果相親活動舉辦地比較符合人情,有個官方的媒婆,她負責將20多對男女根據彼此的喜好,性格進行配對,這樣就減少了相親者之間的耦合關係,節省相親者們的時間和精力,此乃中介者模式之妙用也。
一、使用場景
1、一組對象以定義良好但是複雜的方式進行通信,比如網絡狀的結構,這樣產生的相互依賴關係結構混亂且難以理解。可以使用中介者模式對複雜依賴關係進行改造,以獲取更好的靈活性。
2、一個對象引用其他很多對象並且直接與這些對象通信,導致該對象難以複用。中介者模式將對象的相互依賴關係轉換爲中介者和對象的依賴關係,使對象能夠靈活複用。
3、想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。
二、UML圖
三、Java實現
package study.patterns.mediator;
import java.util.ArrayList;
import java.util.List;
/**
* 中介者模式將一個網狀的系統結構變成一個以中介者對象爲中心的星形結構,
* 在這個星型結構中,使用中介者對象與其他對象的一對多關係來取代原有對象之間的多對多關係。
* 中介者模式在事件驅動類軟件中應用較爲廣泛,特別是基於GUI(Graphical User Interface,
* 圖形用戶界面)的應用軟件,此外,在類與類之間存在錯綜複雜的關聯關係的系統中,
* 中介者模式都能得到較好的應用。
* @author qbg
*/
public class MediatorPattern {
public static void main(String[] args) {
List<Person> ps = new ArrayList<Person>();
Person b0 = new Boy();
ps.add(b0);
Person b1 = new Boy();
ps.add(b1);
Person g0 = new Girl();
ps.add(g0);
Person g1 = new Girl();
ps.add(g1);
Mediator mediator = new ConcreteMediator(ps);
b0.setInterest("創業");
b0.setMediator(mediator);
b1.setInterest("掙錢");
b1.setMediator(mediator);
g0.setInterest("逛街");
g0.setMediator(mediator);
g1.setInterest("持家");
g1.setMediator(mediator);
b0.interest("持家");
System.out.println("==========男女有別===============");
g0.interest("掙錢");
}
}
/**
* 中介者抽象接口
*/
interface Mediator{
public void interestChanged(Person p);
}
/**
* 具體中介者,充當媒婆的角色。
*/
class ConcreteMediator implements Mediator{
private List<Person> miai; //相親隊伍
public ConcreteMediator(List<Person> ps){
this.miai = ps;
}
/**
* 相親者興趣改變時進行響應,重新匹配候選人.
* 封裝同事對象之間的交互.
*/
@Override
public void interestChanged(Person p) {
boolean succeed = false;
Person candidate = null;
for(Person person : miai){
//不是相親者本身且興趣相同則匹配成功!
if(person!=p && p.interest.equals(person.interest)){
succeed = true;
candidate = person;
break;
}
}
p.update(succeed);
if(candidate!=null){
candidate.update(succeed);
}
}
}
/**
* 人,抽象同事類
*/
abstract class Person{
protected Mediator mediator;//中介者引用
protected String interest;//興趣
public void setMediator(Mediator m){
this.mediator = m;
}
public void setInterest(String in){
this.interest = in;
}
public void interest(String interest){
this.interest = interest;
mediator.interestChanged(this);
}
public abstract void update(boolean succeed);
}
/**
* 男生,具體同事類
*/
class Boy extends Person{
@Override
public void update(boolean succeed) {
if(succeed){
System.out.println("相親成功,大喝一頓!!!");
}else{
System.out.println("相親失敗,明天再戰!!!");
}
}
}
/**
* 女生,具體同事類
*/
class Girl extends Person{
@Override
public void update(boolean succeed) {
if(succeed){
System.out.println("找到白馬王子了,去KTV狂歡!");
}else{
System.out.println("黑驢都沒找到,全是騾子,嗚嗚....");
}
}
}
運行結果:
相親成功,大喝一頓!!!
找到白馬王子了,去KTV狂歡!
==========男女有別===============
找到白馬王子了,去KTV狂歡!
相親成功,大喝一頓!!!
四、模式優缺點
優點:
1、減少了子類的生成。中介者Mediator將原本分佈於多個對象間的行爲集中在一起。改變這些行爲只需生成Mediator的子類即可,這樣各個同事類(Colleague類)可被重用。
2、將各Colleague解耦。Mediator有利於各Colleague間的松耦合,你可以獨立的改變和複用各Colleague和Mediator類。
3、簡化了對象協議。用Mediator和各Colleague間的一對多的交互來代替多對多的交互,使對象關係更易於理解,維護和擴展。
4、對對象如何協作進行了抽象。中介者模式很好的將使用者的注意力從對象各自本身的行爲轉移到它們之間的交互上。
5、使控制集中化。中介者模式將交互的複雜性變爲中介者的複雜性。
缺點:
1、由於中介者模式將控制集中到中介者身上,可能會導致中介者過於複雜而難於維護。