zoukankan      html  css  js  c++  java
  • 最简单的 MVC 模式实例

    有许多朋友质疑这种MVC模式不正确。如果按照经典的MVC模式定义,这种实现确实是不正确的。

    经典的MVC模式中,控制器仅仅是根据请求来决定调用哪一个视图,然后视图再调用模型来获取结果并显示。而我下面实现这种MVC模式,控制器要根据请求来决定调用哪一个模型,并传递参数给模型,然后获取结果。最后将结果传递给视图,视图只负责显示结果。

    两种实现的比较如下:

      经典MVC模式 异化的MVC模式
    控制器 仅负责决定调用哪一个视图 需要负责调用模型,并将从模型获取的结果传递给视图
    视图 需要决定调用哪一个模型,获取结果后显示 仅仅是显示传入的数据
    模型 根据调用返回结果,不与控制器和视图发生关系 根据调用返回结果,不与控制器和视图发生关系
    优点 分离表现层和业务层,控制器非常简单 分离表现层和业务层,视图非常简单,更容易和模版引擎结合
    缺点 视图依赖于模型,容易将业务逻辑混入视图 控制器更复杂,容易将业务逻辑混入控制器

    上面的表格简单比较了经典MVC模式和异化后的MVC模式之间的差别和优劣。

    事实是,现在流行的PHP开发框架,都采用了异化后的MVC模式。因为异化后的MVC模式更容易和模版引擎结合,而且再配合Template View、Front Controller、Dispatcher等模式,能够进一步提高应用程序的结构化程度。

    对于简单的应用程序,模型提供数据库CRUD操作,而控制器完成一部分业务逻辑操作。如果没有使用模版引擎,那么在控制器中使用include()就可以载入模版文件(视图)来显示结果。

    对于复杂的应用程序,模型封装业务逻辑,而数据库操作则由数据源层负责。此时控制器只是调用模型获得结果,然后传递给视图。即便使用模版引擎,控制器也可以通过控制器基类的方法来处理。这样不但简单、代码量少,而且可以很方便的使用不同的模版引擎。

    ======================================

    这个实例虽然简单,但是充分体现了 MVC 模式对分离“表现层”和“业务逻辑层”带来的帮助。

    首先呢,还是有一个调度器,负责根据 HTTP 请求决定要调用的控制器:

    PHP代码
    1. <?php    
    2. require ('controller/' . preg_replace('/[^a-z0-9_]+/i'''$_GET['controller']));    
    3. ?>  

    一个控制器:

    PHP代码
    1. <?php    
    2. // 从 Model 获取数据    
    3. require ('model/m1.php');    
    4. $m = new m1();    
    5. $data = $m->getData();    
    6.      
    7. // 构造视图,显示输出    
    8. require ('view/v1.php');    
    9. $v = new v1();    
    10. $v->assign($data);    
    11. $v->display();    
    12. ?>  

    一个 Model:

    PHP代码
    1. <?php    
    2. class m1    
    3. {    
    4.     function getData() {    
    5.         return 'hello';    
    6.     }    
    7. }    
    8. ?>   
     

    一个 View:

    PHP代码
    1. <?php    
    2. class v1    
    3. {    
    4.     var $data;    
    5.      
    6.     function assign($data) {    
    7.         $this->data = $data;    
    8.     }    
    9.      
    10.     function display() {    
    11.         echo $this->data;    
    12.     }    
    13. }    
    14. ?> 
  • 相关阅读:
    第一次 实习笔记
    docker 提示 Drive has not been shared 错误
    使用matplotlib画出log的图像
    python基础实现tcp文件传输
    django简单实现注册登录模块
    python使用消息队列RabbitMq(进阶)
    scrapy爬虫值Items
    redis常见配置redis.conf
    js实现往数组中添加非存在的对象,如果存在就改变键值。
    CSS之user-select——设置标签中的文字是否可被复制
  • 原文地址:https://www.cnblogs.com/kuyuecs/p/1274582.html
Copyright © 2011-2022 走看看