中介者模式屬於行為型模式。
中介者模式的定義
定義:用一箇中介者物件來封裝一系列的物件互動。中介者使得各物件不需要顯式地相互引用,從而使其鬆散耦合,而且可以獨立地改變它們之間的互動。
在軟體開發中,通過提供一個統一的介面讓系統不同部分進行通訊。一般,如果系統有很多子模組需要直接溝通,都要建立一箇中央控制點讓其各模組通過中央控制點進行互動。中介者模式可以讓這些子模組不需要直接溝通,從而達到進行解耦的目的。在現實生活中,有很多中介者模式的身影,例如二手車平臺、婚姻中介和房產中介,通過平臺方介入進行協調供需之間的關係。
中介者模式的結構
中介者模式有如下角色:
- Mediator
中介者定義一個介面用於與各同事(Colleague)物件通訊。 - ConcreteMediator
具體中介者通過協調各同事物件實現協作行為,瞭解並維護它的各個同事。 - Colleague
抽象同事類。 - Colleagueclass
具體同事類。每個具體同事類都只需要知道自己的行為即可,但是他們都需要認識中介者
中介者模式的實現
定義抽象Mediator:
public abstract class Mediator {
public abstract void notice(String content,Colleague coll);
}
複製程式碼
定義抽象同事Colleague:
public abstract class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
複製程式碼
具體同事類繼承自Colleague,此刻就可以與中介者mediator進行通訊了。
public class ColleagueA extends Colleague {
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
public void getNotice(String message){
System.out.println("同事A"+name+"獲得資訊"+message);
}
//同事A與中介者通訊
public void contact(String message){
mediator.notice(message, this);
}
}
複製程式碼
public class ColleagueB extends Colleague {
public ColleagueB(String name, Mediator mediator) {
super(name, mediator);
}
public void getNotice(String message){
System.out.println("同事B"+name+"獲得資訊"+message);
}
//同事B與中介者通訊
public void contact(String message){
mediator.notice(message, this);
}
}
複製程式碼
定義具體中介者ConcreteMediator,具體中介者通過協調各同事物件實現協作行為,瞭解並維護它的各個同事。
@Data
public class ConcreteMediator extends Mediator {
ColleagueA collA;
ColleagueB collB;
@Override
public void notice(String content, Colleague coll) {
if (coll == collA) {
collB.getNotice(content);
} else {
collA.getNotice(content);
}
}
}
複製程式碼
定義中介者與具體同事類,中介者知曉每一個具體的Colleague類。
public class Client {
// 中介者,ColleagueA、ColleagueB
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ColleagueA colleagueA = new ColleagueA("A", mediator);
ColleagueB colleagueB = new ColleagueB("B", mediator);
mediator.setCollA(colleagueA);
mediator.setCollB(colleagueB);
colleagueA.contact("我是A,我要聯絡B!");
colleagueB.contact("我是B,收到A訊息!");
}
}
複製程式碼
執行結果很簡單,讀者自己試一下吧。
總結
中介者模式簡化了物件之間的關係,將系統的各個物件之間的相互關係進行封裝,將各個同事類解耦,使得系統變為鬆耦合。並且提供系統的靈活性,使得各個同事物件獨立而易於複用。
其缺點也很明顯:
- 中介者模式中,中介者角色承擔了較多的責任,所以一旦這個中介者物件出現了問題,整個系統將會受到重大的影響。
- 新增加一個同事類時,不得不去修改抽象中介者類和具體中介者類,此時可以使用觀察者模式和狀態模式來解決這個問題。
中介者模式適用於當物件之間的互動變多時,為了防止一個類會涉及修改其他類的行為,可以使用中介者模式,將系統從網狀結構變為以中介者為中心的星型結構。
vs 外觀模式
外觀模式主要是以封裝和隔離為主要任務,中介者則是協調同事類之間的關係,因此,中介者具有部分業務的邏輯控制。他們之間的主要區別為:
- 外觀模式的子系統如果脫離外觀模式還是可以執行的,而中介者模式增加了業務邏輯,同事類不能脫離中介者而獨自存在。
- 外觀模式將子系統的邏輯隱藏,使用者不知道子系統的存在,而中介者模式中,使用者知道同事類的存在。