設計模式,行爲模式之中介者模式

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 總結

中介者模式使得程序更易於修改和擴展。當對象之間的關係/通信很複雜的時候,可以看看,是否可以通過抽象出一箇中心點作爲中介者,來解耦了對象之間的依賴。

文中例子的github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章