iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

中介者模式透過獨立的物件來協調物件之間的互動行為,避免它們相互依賴。

生活範例

想像你在一間公司,各部門都透過專案管理組來進行溝通。每當某個部門有需求時,都會聯絡專案管理組,再由產品負責人協調相關人員做出回應。專案管理組就像是中介者,根據客戶的需求聯繫相關人員解決問題。

這樣的好處是,客戶不需要了解公司內部的運作細節,而各部門之間的工作也變得更有條理,減少了混亂和無效的溝通。

舉個例子

在多人聊天室中,每個使用者都可以傳送訊息給其他使用者。假如使用者必須指名訊息的發送對象,掌握其他使用者的登入狀態,這個系統會變得過於複雜。我們可以使用中介者模式來設計聊天室,讓中介者複雜接收和轉發訊息,簡化使用者之間的互動。

這個類別代表聊天室的使用者,每個使用者可以發送和接收訊息。當使用者發送訊息時,訊息會經過中介者 ChatRoom 傳遞給其他使用者。

class User {
  constructor(private chatRoom: ChatRoom, public name: string) {}

  sendMessage(message: string) {
    this.chatRoom.messageReceived(message, this);
  }

  receiveMessage(message: string, sender: User) {
    console.log(
      `${this.name} received message from ${sender.name}: ${message}`
    );
  }
}

ChatRoom 類別是中介者,負責協調和管理多個使用者之間的訊息傳遞。當某個使用者發送訊息時,中介者會確保其他使用者接收到該訊息。

class ChatRoom {
  private users: User[] = [];

  addUser(user: User) {
    this.users.push(user);
  }

  messageReceived(message: string, sender: User) {
    console.log(`${sender.name} sent message: ${message}`);

    this.users.forEach((user) => {
      if (user !== sender) {
        user.receiveMessage(message, sender);
      }
    });
  }
}

我們模擬了聊天室的運作,創建一個聊天室並加入三位使用者,然後模擬他們之間的訊息傳遞。

class ChatRoomTestDrive {
  static main() {
    const chatRoom = new ChatRoom();
    const user1 = new User(chatRoom, "Evans");
    const user2 = new User(chatRoom, "Howard");
    const user3 = new User(chatRoom, "Judy");

    chatRoom.addUser(user1);
    chatRoom.addUser(user2);
    chatRoom.addUser(user3);

    user1.sendMessage("Hello, everyone!");
    user2.sendMessage("Hi, Evans!");
    user2.sendMessage("Want to meet this weekend?");
  }
}

ChatRoomTestDrive.main();

輸出結果。

Evans has joined the chat.
Howard has joined the chat.
Judy has joined the chat.
Evans sent message: Hello, everyone!
Howard received message from Evans: Hello, everyone!
Judy received message from Evans: Hello, everyone!
Howard sent message: Hi, Evans!
Evans received message from Howard: Hi, Evans!
Judy received message from Howard: Hi, Evans!
Howard sent message: Anyone want to drink tonight?
Evans received message from Howard: Anyone want to drink tonight?
Judy received message from Howard: Anyone want to drink tonight?
Judy sent message: Always have time for a drink!
Evans received message from Judy: Always have time for a drink!
Howard received message from Judy: Always have time for a drink!

定義

Mediator Pattern

  • 中介者介面(Mediator): 定義參與者之間的溝通方式
  • 中介者(ConcreteMediator): 負責管理和協調參與者之間的互動行為
  • 參與者(College): 依賴中介者進行溝通的物件

在中介者模式中,物件不會直接溝通,而是透過中介者發送與接收訊息。中介者根據收到的訊息協調其他物件執行任務,從而避免物件之間直接互動。這不僅降低了耦合性,還讓物件的職責更為單一,從而提升了它們的重用性。我們可以透過替換中介者來改變物件行為,而無需修改程式碼,以靈活應對不同情境

總結

  • 物件不會直接溝通,而是透過中介者來發送與接收訊息
  • 中介者負責接收訊息並協調其他物件做出回應
  • 物件只需透過中介者溝通,無需彼此依賴,這降低了它們之間的耦合性
  • 我們可以替換中介者來改變物件的行為,而不必修改物件的程式碼

完整範例

https://github.com/chengen0612/design-patterns-typescript/blob/main/patterns/behavioral/mediator.ts


上一篇
Day 21 - Proxy 代理
下一篇
Day 23 - Flyweight 享元
系列文
前端也想學設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言