MVC架构中的Controller
MVC架构中Controller作为中介者协调Model和View的交互避免Model和View直接耦合。场景用户列表页面View显示用户列表Model提供用户数据。用户点击删除按钮时View通知ControllerController调用Model删除用户Model返回结果后Controller更新View。角色对照MediatorUserControllerColleagueUserModel数据层、UserView视图层// Model用户数据同事类A class UserModel { private ListString users new ArrayList(Arrays.asList(Alice, Bob, Charlie)); public ListString getUsers() { return new ArrayList(users); } public boolean deleteUser(String username) { return users.remove(username); } } // View用户视图同事类B class UserView { public void showUsers(ListString users) { System.out.println(用户列表 users); } public void showMessage(String message) { System.out.println(提示 message); } // 用户点击删除按钮通知Controller public void onDeleteClicked(String username, UserController controller) { controller.handleDelete(username); } } // Controller中介者 class UserController { private UserModel model; private UserView view; public UserController(UserModel model, UserView view) { this.model model; this.view view; } // 协调Model和View的交互 public void handleDelete(String username) { boolean success model.deleteUser(username); // 调用Model if (success) { view.showMessage(删除成功 username); // 更新View view.showUsers(model.getUsers()); // 刷新列表 } else { view.showMessage(删除失败 username 不存在); } } public void showUserList() { view.showUsers(model.getUsers()); } }关键点Model只负责数据操作不关心View如何显示View只负责显示和接收用户操作不关心Model如何处理数据Controller作为中介者协调两者Model和View通过Controller通信。多人聊天室聊天室是中介者模式的经典应用聊天室服务器作为中介者用户作为同事类用户之间不直接通信都通过聊天室转发消息。场景多人聊天室用户A发送消息时聊天室服务器转发给所有其他用户。用户加入或退出时聊天室通知所有用户。角色对照MediatorChatRoom接口ConcreteMediatorConcreteChatRoom维护用户列表转发消息ColleagueUser抽象类ConcreteColleagueChatUser具体用户实现// 抽象中介者 interface ChatRoom { public void register(User user); public void send(String message, User sender); } // 抽象同事类用户基类 abstract class User { protected ChatRoom chatRoom; protected String name; public User(ChatRoom chatRoom, String name) { this.chatRoom chatRoom; this.name name; } public String getName() { return name; } public abstract void receive(String message, String senderName); public abstract void send(String message); } // 具体中介者聊天室 class ConcreteChatRoom implements ChatRoom { private ListUser users new ArrayList(); public void register(User user) { users.add(user); System.out.println(user.getName() 加入聊天室); // 通知其他用户 for (User u : users) { if (u ! user) { u.receive(user.getName() 加入了聊天室, 系统); } } } public void send(String message, User sender) { // 转发给除发送者外的所有用户 for (User u : users) { if (u ! sender) { u.receive(message, sender.getName()); } } } } // 具体同事类聊天用户 class ChatUser extends User { public ChatUser(ChatRoom chatRoom, String name) { super(chatRoom, name); } public void receive(String message, String senderName) { System.out.println([ name 收到] senderName message); } public void send(String message) { System.out.println([ name 发送] message); chatRoom.send(message, this); // 通过中介者转发 } } // 使用示例 public class ChatRoomDemo { public static void main(String[] args) { ChatRoom room new ConcreteChatRoom(); User alice new ChatUser(room, Alice); User bob new ChatUser(room, Bob); User charlie new ChatUser(room, Charlie); room.register(alice); // Alice加入无其他用户 room.register(bob); // Bob加入通知Alice room.register(charlie);// Charlie加入通知Alice和Bob alice.send(大家好); // Alice发消息Bob和Charlie收到 bob.send(Hi Alice!); // Bob发消息Alice和Charlie收到 }