推薦:Java設計模式彙總
中介者模式
定義
中介者模式又稱為調停者模式,用一個中介者來封裝一系列的對象互動,中介者使各對象不需要顯式地互相引用,減少類之間的依賴,進而使其耦合松散,而且可以獨立地改變它們之間的互動。
類型
行為型。
例子
慕課網的每門實戰課程都有相應的交流群,裡面有很多學員,學員可以在裡面讨論問題,這個交流群其實就是一個中介者,是所有學員互相交流的一個中介者,我們先不考慮所有學員都能收到交流群更新的消息,我們現在隻關心交流群作為中介者可以讓所有學員互相交流,每個學員通過交流群就可以和其他所有學員進行交流,這就将多對多的關系轉化成了一對多的關系。
StudyGroup類(中介者),相當于交流群。
package com.kaven.design.pattern.behavioral.mediator;
import java.util.Date;
public class StudyGroup{
public static void showMessage(User user , String message){
System.out.println(new Date().toString() + " ["+user.getName()+"]:"+message);
}
}
User類(同僚),相當于學員。
package com.kaven.design.pattern.behavioral.mediator;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public void sendMessage(String message){
StudyGroup.showMessage(this,message);
}
}
應用層代碼:
package com.kaven.design.pattern.behavioral.mediator;
public class Test {
public static void main(String[] args) {
User kaven = new User("kaven");
User yy = new User("yy");
kaven.sendMessage("Hey! yy! Let's learn Design Pattern");
yy.sendMessage("OK! kaven");
}
}
輸出:
Thu Jan 30 23:03:48 CST 2020 [kaven]:Hey! yy! Let's learn Design Pattern
Thu Jan 30 23:03:48 CST 2020 [yy]:OK! kaven
這裡便完成了一個簡單的中介者模式例子。
适用場景
- 系統中對象之間存在複雜的引用關系,系統結構混亂且難以了解。
- 一個對象由于引用了其他很多對象并且直接和這些對象通信,導緻難以複用該對象。
- 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。可以通過引入中介者類來實作,在中介者中定義對象互動的公共行為,如果需要改變行為則可以增加新的具體中介者類。
優點
- 中介者模式簡化了對象之間的互動,它用中介者和同僚的一對多互動代替了原來同僚之間的多對多互動,一對多關系更容易了解、維護和擴充,将原本難以了解的網狀結構轉換成相對簡單的星型結構。
- 中介者模式可将各同僚對象解耦。中介者有利于各同僚之間的松耦合,我們可以獨立的改變和複用每一個同僚和中介者,增加新的中介者和新的同僚類都比較友善,更好地符合“開閉原則”。
- 可以減少子類生成,中介者将原本分布于多個對象間的行為集中在一起,改變這些行為隻需生成新的中介者子類即可,這使各個同僚類可被重用,無須對同僚類進行擴充。
- 在具體中介者類中包含了大量同僚之間的互動細節,可能會導緻具體中介者類非常複雜,使得系統難以維護。(也就是把具體同僚類之間的互動複雜性集中到了中介者類中,結果中介者成了最複雜的類)。