当前位置: 首页 > news >正文

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收到 }
http://www.jsqmd.com/news/1139718/

相关文章:

  • Scikit-learn 1.3 与 Pandas 2.0 缺失值填充:KNNImputer 与 IterativeImputer 性能实测
  • 影刀RPA新手教程:猫眼票务自动化完全指南——票房数据采集、影院排片分析与舆情监控
  • 洛雪音乐音源终极配置指南:如何打造完美的全网音乐体验
  • WebODM技术深度解析:分布式无人机图像处理架构与算法实现
  • 3DThinkVLA:面向具身智能的隐式三维空间语义对齐框架
  • 栈溢出漏洞原理与OllyDbg调试实战:从概念到利用的完整指南
  • Qwen图像编辑AI加速器:从v1到v23的完整版本选择指南
  • AI教材生成新趋势:低查重AI写教材,快速打造专业教材!
  • 别再只用微信接口发小广告了!聊聊怎么把它接进公司业务系统搞定真自动化
  • 计算机毕业设计之基于web和微信小程序学生课程管理系统
  • 7 个技术写作技巧,让你的文档更出色
  • “你这代码写得太烂了“:程序员如何识别职场PUA,拒绝被煤气灯
  • CAD图纸为什么要上传云图?多端同步,杜绝图纸丢失风险!
  • Efficient LLM Inference 与 Serving:KV Cache、Speculative Decoding、PagedAttention 和量化
  • 影刀RPA新手教程:淘宝直播数据监控完全指南——观看人数、互动数据与商品点击率采集
  • 电机控制器硬件架构演进:从三块PCBA到三合一板卡的3个关键设计挑战
  • 前端JS加密逆向实战:从算法特征识别到调试技巧全解析
  • Foliate电子书阅读器完整指南:GTK4+WebKitGTK打造的高效Linux阅读方案
  • 2026年家具AI生图工具:木创家AI 13项核心功能解析
  • 从总部项目实践看泛光照明的新走向
  • 单片机晶振电路PCB布局3大核心要点:从原理到解决EMI干扰
  • 车轮毂制动点位等区域检测数据集VOC+YOLO格式299张16类别
  • 谈表达式树的缓存(4):使用二叉搜索树(AVL树)
  • 终极GTA5安全菜单:YimMenu完整防护与功能指南
  • Burp Suite 2025.1新功能实测:自动暂停攻击与CSV导出协作数据
  • Windows 11界面修复终极指南:三步恢复消失的开始菜单磁贴与深度定制
  • 预售+易货:一个把“提前锁定“和“以物换物“焊在一起的玩法
  • ORB-SLAM3 SearchByBoW 1
  • 相似模式区分
  • 心电信号图神经网络论文分享(1)——MSAGFN多尺度双图融合