1 概述
中介者模式(Mediator Pattern)是一種行爲模式,通過定義一箇中介對象,來管理一系列對象之間的依賴,從而解耦原有對象之間的關係。
2 中介者模式
大量的對象相互依賴,會大大增加系統複雜度,提高維護成本。中介者模式(Mediator Pattern)是迪米特原則的一個很好體現,它通過將對象的依賴關係維護在一個中介者中,使原本耦合在一起的對象變得相互獨立。
交通信號燈是一個很常見的例子,如果沒有信號燈,十字路口的車子必須知道互相之間要去的方向,來決定什麼時候踩油門,什麼時候踩剎車,如此一來很容易堵車。而信號燈的作用就是中介者,司機們不用關心其他車子,只需按照“紅燈停,綠燈行”的規則,按照燈的指示來做行駛。信號燈充當來中介者,維護了交通秩序。
3 案例
讓我們來看一個更簡單的例子。聊天室提供了羣聊的功能,可以增加,刪除成員。內部的人員,可以將消息發送給所有的其他人。如果說每個成員內部都維護一個所有成員的列表,直接點對點發送消息,那麼當人數很多的時候,整個邏輯會變得很複雜,同時,對於人員的增減,也將是個繁重的工作。現實中我們當然不會這麼做,而是通過定義一個ChatRoom
對象,來維護羣聊成員列表,同時負責管理消息的發送,看看用中介者模式,如何優雅地設計聊天室:
public interface ChatRoom {
void broadcast(String message, Member sender);
void addMember(Member member);
void removeMember(Member member);
}
public class ChatRoomImpl implements ChatRoom {
List<Member> memberList = new ArrayList<>();
@Override
public void broadcast(String message, Member sender) {
for (Member member : memberList) {
if (!member.equals(sender)) {
member.receive(message);
}
}
}
@Override
public void addMember(Member member) {
if (!memberList.contains(member)) {
memberList.add(member);
member.setChatRoom(this);
}
}
@Override
public void removeMember(Member member) {
memberList.remove(member);
}
}
public abstract class Member {
protected ChatRoom chatRoom;
protected String name;
public Member(String name){
this.name=name;
}
public void setChatRoom(ChatRoom chatRoom) {
this.chatRoom = chatRoom;
}
public abstract void send(String message);
public abstract void receive(String message);
}
public class MemberImpl extends Member {
public MemberImpl(String name) {
super(name);
}
@Override
public void send(String message) {
System.out.println(name + " send message: " + message);
chatRoom.broadcast(message, this);
}
@Override
public void receive(String message) {
System.out.println(name + " received message: " + message);
}
}
public class Test {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoomImpl();
Member link = new MemberImpl("Link");
Member mario = new MemberImpl("Mario");
Member yoshi = new MemberImpl("Yoshi");
chatRoom.addMember(link);
chatRoom.addMember(mario);
chatRoom.addMember(yoshi);
link.send("Hello");
}
}
輸出:
Link send message: Hello
Mario received message: Hello
Yoshi received message: Hello
可以發現,Member
對象之間,無需彼此依賴,甚至都不需要知道彼此之間的存在,所有的關係依賴都維護在ChatRoom
中。對於成員的修改,增減,並不會影響到整個系統。
其實即時通信類的架構模式,都是上述模式的擴展。比如微信中,每個客戶端(IOS
/Android
)充當的是Member
角色,他們之間並不直接交互,而是通過騰訊的服務器(ChatRoom
角色),來發送和接收消息。從某種意義上來說,中介者模式是即時通信的基石。
4 總結
中介者模式使得程序更易於修改和擴展。當對象之間的關係/通信很複雜的時候,可以看看,是否可以通過抽象出一箇中心點作爲中介者,來解耦了對象之間的依賴。