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. ?>  
  • 相关阅读:
    【Spring Cloud】异常记录
    目录
    java8 语言特性
    Java 8 并发编程
    Spring Boot系列(四) Spring Cloud 之 Config Client
    找到字符串中最长的非重复子串
    Spring Boot系列(四) Spring Boot 之验证
    链表两数相加(add two numbers)
    找到数组中和为给定值的两个数
    Spring Boot系列(三) Spring Boot 之 JDBC
  • 原文地址:https://www.cnblogs.com/yeye518/p/2231725.html
Copyright © 2011-2022 走看看