中介者模式用于減少多個對象之間的直接通信,而是通過一個中介對象來協調它們之間的交互。下面我用一個聊天室的例子來演示這個模式。
舉個栗子:聊天室系統
在這個系統中,用戶不直接相互發送消息,而是通過聊天室(中介者)來轉發消息。
1. 定義中介者接口
// 中介者接口
public interface ChatRoomMediator {void sendMessage(String message, User user);void addUser(User user);
}
2. 實現具體中介者 - 聊天室
import java.util.ArrayList;
import java.util.List;// 具體中介者 - 聊天室
public class ChatRoom implements ChatRoomMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void addUser(User user) {this.users.add(user);}@Overridepublic void sendMessage(String message, User sender) {for (User user : users) {// 不將消息發送給自己if (user != sender) {user.receive(message);}}}
}
3. 定義同事類 - 用戶
// 同事類 - 用戶
public abstract class User {protected ChatRoomMediator mediator;protected String name;public User(ChatRoomMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receive(String message);
}
4. 實現具體同事類 - 聊天用戶
// 具體同事類 - 聊天用戶
public class ChatUser extends User {public ChatUser(ChatRoomMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(this.name + " 發送: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(this.name + " 收到: " + message);}
}
測試類
public class ChatRoomDemo {public static void main(String[] args) {// 創建中介者 - 聊天室ChatRoomMediator chatRoom = new ChatRoom();// 創建用戶并加入聊天室User john = new ChatUser(chatRoom, "John");User jane = new ChatUser(chatRoom, "Jane");User doe = new ChatUser(chatRoom, "Doe");chatRoom.addUser(john);chatRoom.addUser(jane);chatRoom.addUser(doe);// 用戶發送消息john.send("大家好!");jane.send("你好 John!");doe.send("今天天氣不錯!");}
}
輸出結果
這個過程有點像netty實現簡單聊天室的功能,不過對于項目中的聊天室來說,用戶信息是初步封裝好的,除非需要二次封裝,這里只簡單介紹一下這個中介者模式。
關鍵點解析
-
Mediator (中介者接口):定義同事對象通信的接口
-
ConcreteMediator (具體中介者):協調各同事對象的交互
-
Colleague (同事類):知道其中介者對象,通信時通過中介者轉發
-
ConcreteColleague (具體同事類):實現自己的行為,需要與其他同事通信時通過中介者
中介者模式的優點
-
減少類間依賴:將多對多關系轉化為一對多關系
-
集中控制:交互邏輯集中在中介者中,易于維護
-
簡化對象協議:用中介者和同事的一對多交互替代多對多交互
適用場景
-
系統中對象之間存在復雜的引用關系
-
需要集中管理對象間的交互行為
-
想定制一個分布在多個類中的行為,又不想生成太多子類
這個聊天室的例子很好地展示了中介者模式如何簡化對象間的通信,特別是在多對象相互交互的復雜場景中。