"""
MVC核心概念:
    Model(模型):
        核心职责:处理数据逻辑(存储、计算、校验),不关心界面--类似:后厨(处理食材 / 做菜)
    View(视图):
        核心职责:负责展示数据、接收用户输入,不处理业务逻辑--类似:服务员(展示菜品 / 传需求)
    Controller(控制器):
        核心职责:连接 Model 和 View,处理业务逻辑、协调两者交互--类似:店长(接收需求→安排后厨→反馈结果)

"""
"""
案例一:学生信息管理系统
    用一个极简的学生信息查询 / 添加功能,实现 MVC 模式,让你直观看到各模块的分工。
"""
# ---------------------- 1. Model(模型):处理数据逻辑 ----------------------
class StudentModel:
    def __init__(self):
        # 模拟数据库:存储学生数据
        self.students = {"001": "张三", "002": "李四"}

    # 查询:获取学生信息
    def get_student(self, student_id):
        return self.students.get(student_id, "学生不存在")

    # 增加:添加学生信息(带简单校验)
    def add_student(self, student_id, name):
        if not student_id or not name:
            return "ID/姓名不能为空"
        if student_id in self.students:
            return "该学生ID已存在"
        self.students[student_id] = name
        return "添加成功"

# ---------------------- 2. View(视图):负责展示和输入 ----------------------
class StudentView:
    # 展示提示信息
    def show_message(self, message):
        print(f"\n【提示】:{message}")

    # 展示学生信息
    def show_student(self, student_id, name):
        print(f"\n【查询结果】:ID={student_id},姓名={name}")

    # 获取用户输入(封装输入逻辑)
    def get_input(self, prompt):
        return input(prompt).strip()

# ---------------------- 3. Controller(控制器):协调交互 ----------------------
class StudentController:

    def __init__(self):
        self.model = StudentModel()
        self.view = StudentView()

    # 处理“查询学生”的业务逻辑
    def handle_query_student(self):
        # 1.从视图获取输入学生id
        student_id = self.view.get_input("请输入学生id:")
        # 2.调用模型处理数据,进行查询
        name = self.model.get_student(student_id)
        # 3.调用视图展示结果
        self.view.show_student(student_id, name)

    # 处理“添加学生”的业务逻辑
    def handle_add_student(self):
        # 1. 从视图获取用户输入
        student_id = self.view.get_input("请输入新学生ID:")
        name = self.view.get_input("请输入新学生姓名:")
        # 2. 调用模型处理数据
        result = self.model.add_student(student_id, name)
        # 3. 调用视图展示结果
        self.view.show_message(result)

# ---------------------- 4. 程序入口:调用控制器 ----------------------
if __name__ == '__main__':
    controller = StudentController()

    # 模拟用户操作
    print("=== 学生信息管理系统 ===")
    controller.handle_query_student()  # 查询学生
    controller.handle_add_student()  # 添加学生
    controller.handle_query_student()  # 再次查询验证


"""
核心分工解析
    Model:只关心数据(students 字典),提供 get/add 方法,完全不涉及 “怎么展示”“怎么获取输入”;
    View:只做两件事 —— 打印信息(show_* 方法)、获取输入(get_input 方法),没有任何业务逻辑;
    Controller:是 “中间人”—— 从 View 拿输入 → 传给 Model 处理 → 把 Model 的结果交给 View 展示,自己只协调流程,不存数据、不做展示。

MVC 模式的优势(为什么要这么设计?)
    解耦易维护:比如想把 “控制台视图” 改成 “网页视图”,只需修改 StudentView 类,Model 和 Controller 完全不用动;
    代码复用:Model 的数据逻辑可以被多个 View 复用(比如同时支持控制台、网页、APP 展示);
    职责清晰:调试时定位问题更快 —— 数据错了查 Model,展示错了查 View,流程错了查 Controller。

总结
    MVC 核心是三分工:Model 管数据、View 管展示、Controller 管协调,三者独立解耦;
    控制器是核心枢纽,所有交互都通过它完成,避免 Model 和 View 直接通信;
    案例中,修改视图(比如改成 GUI 界面)或修改数据存储(比如用数据库替代字典),都只需改对应模块,不影响其他部分。

"""

更多推荐