MVC架构中的Controller

📅 2026/7/7 7:07:39 👁️ 阅读次数 📝 编程学习
MVC架构中的Controller

MVC架构中,Controller作为中介者协调Model和View的交互,避免Model和View直接耦合。

场景:用户列表页面,View显示用户列表,Model提供用户数据。用户点击删除按钮时,View通知Controller,Controller调用Model删除用户,Model返回结果后Controller更新View。

角色对照

  • MediatorUserController
  • ColleagueUserModel(数据层)、UserView(视图层)
// Model:用户数据(同事类A) class UserModel { private List<String> users = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie")); public List<String> getUsers() { return new ArrayList<>(users); } public boolean deleteUser(String username) { return users.remove(username); } } // View:用户视图(同事类B) class UserView { public void showUsers(List<String> 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 List<User> 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收到 }