前端web开发的MVC模式 - 从一个简单实例讲起

来源: 冬日的蜗牛 发布时间:2018-11-22 14:44:48 阅读量:1204

MVC是一种设计模式,它将应用划分为3个部分:数据(模型)、展现层(视图)和用户交互(控制器)。其中:

M - MODEL(模型)

V - VIEW(视图)

C - CONTROLLER(控制器)

一个事件的发生是这样的过程:
  1. 用户和应用产生交互。
  2. 控制器的事件处理器被触发。
  3. 控制器从模型中请求数据,并将其交给视图。
  4. 视图将数据呈现给用户。
不用类库或框架就可以实现这种MVC架构模式。关键是要将MVC的每部分按照职责进行划分,将代码清晰地分割为若干部分,并保持良好的解耦。这样可以对每个部分进行独立开发、测试和维护。

M-模型

  模型用来存放应用的所有数据对象。比如,可能有一个User模型,用以存放用户列表、他们的属性及所有与模型有关的逻辑。模型不必知道视图和控制器的逻辑。任何事件处理代码、视图模板,以及那些和模型无关的逻辑都应当隔离在模型之外。将模型的代码和视图的代码混在一起,是违反MVC架构原则的。模型是最应该从应用中解耦出来的部分。
当控制器从服务器抓取数据或创建新的记录时,它就将数据包装成模型实例。也就是说,我们的数据是面向对象的,任何定义在这个数据模型上的函数或逻辑都可以直接被调用。

V-视图

  视图层是呈现给用户的,用户与之产生交互。在JavaScript应用中,视图大都是由HTML、CSS、JavaScript模板组成的。除了模板中简单的条件语句之外,视图不应当包含任何其他逻辑。将逻辑混入视图之中是编程的大忌,这并不是说MVC不允许包含视觉呈现相关的逻辑,只要这部分逻辑没有定义在视图之内即可。我们将视觉呈现逻辑归类为“视图助手”(helper):和视图相关的独立的小工具函数。

C-控制器

  控制器是模型和视图之间的纽带。控制器从视图获取事件和输入,对它们(很可能包含模型)进行处理,并相应地更新视图。当页面加载时,控制器会给视图添加事件监听,比如监听表单提交或按钮点击。然后,当用户和你的应用产生交互时,控制器中的事件触发器就开始工作了。


例如 需要给一个页面上的button注册一个onclick事件。


         1、我们可以有如下最简洁的写法:(view和model control完全混合)

  1. <HTML>  

  2.   

  3. <HEAD>  

  4.   

  5. <TITLE> example </TITLE>  

  6.   

  7. </HEAD>  

  8.   

  9. <BODY>  

  10.   

  11. <input type="button" value="baidu" onclick="alert(this.value);"/>  

  12.   

  13. </BODY>  

  14.   

  15. </HTML>  


         说明:如上写法的好处:简单、直接;严重的弊端:如果都是这样写法,页面代码很大的时候,修改js代码还需要查找整个页面,导致整个页面非常混乱。批注:类似与 jsp中直接嵌入java片段语句。


         2、将html和js代码进行适当分离:(view和model control在同一页面适当分离)

         修改以上的写法:

  1. <HTML>  

  2.   

  3. <HEAD>  

  4.   

  5. <TITLE> example </TITLE>  

  6.   

  7. </HEAD>  

  8.   

  9. <BODY>  

  10.   

  11. <input type="button" value="baidu" onclick="tipInfo(this);"/>  

  12.   

  13. <SCRIPT LANGUAGE="JavaScript">  

  14.   

  15. <!--  

  16.   

  17.     function tipInfo(o){  

  18.   

  19.            alert(o.value);  

  20.   

  21.     }  

  22.   

  23. //-->  

  24.   

  25. </SCRIPT>  

  26.   

  27. </BODY>  

  28.   

  29. </HTML>  

         这是将页面上所有的js代码操作放到<script></script>标签中进行。使得js逻辑代码相对集中,易于后期修改。

         但是我们还是需要在html标签中写tipInfo(this)的js调用代码。即html和js仍然有混合。


         3、将html和js代码彻底分离:(view和model control完全分离)

         修改写法:

         视图view的html代码:

  1. <HTML>  

  2.   

  3. <HEAD>  

  4.   

  5. <TITLE> example </TITLE>  

  6.   

  7. </HEAD>  

  8.   

  9. <BODY>  

  10.   

  11. <input type="button" value="baidu" id="baidu"/>  

  12.   

  13. </BODY>  

  14.   

  15. <script src="example.js"></script>  

  16.   

  17. </HTML>  

         分离出来的模型model和控制control的综合example.js代码:

   

[javascript] view plaincopy
  1. var o = document.getElementById("baidu");  

  2.   

  3.     o.onclick = function(){  

  4.   

  5.            alert(this.value);  

  6.   

  7.     }  

         说明:button节点的操作和事件注册等工作完全与html页面分离。但是仔细想想,这还不是一个基于MVC的模式,control和model完全混合在一起。

         批注:与jsp中的javabean实现类似。


         4、符合MVC框架的实现:(view、mode和control完全分离)

         View视图的view.html代码:

[javascript] view plaincopy
  1. <HTML>  

  2.   

  3. <HEAD>  

  4.   

  5. <TITLE> example </TITLE>  

  6.   

  7. </HEAD>  

  8.   

  9. <BODY>  

  10.   

  11. <input type="button" value="baidu" id="baidu"/>  

  12.   

  13. </BODY>  

  14.   

  15.     <script src="model.js"></script>  

  16.   

  17. <script src="control.js"></script>  

  18.   

  19. </HTML>  


         实现control控制功能的control.js代码:

  

[javascript] view plaincopy
  1. function G(id){  

  2.   

  3.           return document.getElementById(id);  

  4.   

  5.    }  

  6.   

  7.    var UI = new Object();  

  8.   

  9.    UI.register = function(id,even,fun,arr){  

  10.   

  11.           if(G(id)) G(id)["on"+even] = function(){ fun(arr);};  

  12.   

  13.    }  

  14.   

  15.    UI.register("baidu","click",tipInfo,[1,2]);  

    /*

           第一参数:为button节点id

           第二参数:为需要注册的触发事件

           第三参数:事件触发函数

           第四参数:需要传递的参数。

*/

         说明:control.js的代码就是实现html页面节点事件的注册。使得节点的各种事件知道会触发什么函数去执行。

         具体的函数操作,可以放到model模块中执行,在model中,才是真正处理逻辑操作。看model.js代码:

   

[javascript] view plaincopy
  1. function tipInfo(arr){  

  2.   

  3.            alert(arr[1]);  

  4.   

  5.            //实现其他组件功能,例如popup、form等。都属于model模型  

  6.   

  7.     }  

        进行分层之后,各个层次的功能清晰:V层控制界面显示,将界面与数据连接;M层存放数据,处理逻辑,C层用于连接M和V,但是,代码变复杂了。的确,层次越多,需要做的工作也越多,这里需要处理各层的通信。所以,具体怎么设计,还是要分析场景,因地制宜。


总结:

         View:只管页面的显示和样式展示

         Control:进行页面节点事件的注册和控制,以及页面加载性能的实现(例如方荣的硬盘缓存)。

         Model:真正的逻辑处理,例如jslib库中的form、popup、drag等功能组件都属于model模块。


标签: PHP
分享:
评论:
你还没有登录,请先