阅读更多

22顶
3踩

企业架构

转载新闻 MVC模式不好用?何不试试MOVE

2012-07-05 17:19 by 副主编 MnouW 评论(22) 有18922人浏览
MVC模式在编程中的应用,是一个很了不起的主意。“数据模型(Model)”可以封装与应用程序的业务逻辑相关的数据及对数据的处理方法;“视图层(View)”能够实现数据有目的的显示;“控制器(Controller)”能够在不同层面间起到组织作用,对应用程序的流程进行控制。

不过,可能你在使用这种三层架构模式的过程中会逐渐迷惑。因为有很多代码你不知道把它放哪,就只好把它放到控制层,最后发现在控制层中塞了太多的代码。

LinkedIn的软件工程师Conrad Irwin也遇到同样的问题,于是他开始使用另一种模式:MOVE,即Models(模型)、Operations(操作)、Views(视图)、Events(事件)。

近日Conrad Irwin在个人博客上分享了关于这种模式的一些观点。


概述

Irwin结合上图对MOVE模式先作了简单定义:

  • Models,封装该应用程序中知道的一切;
  • Operations,封装该应用程序要做的一切;
  • Views,帮助用户与应用程序完成交互;
  • Events,用于安全地连接所有这些组件。
为了避免意大利面条式的代码,图中标示出了对哪种类型的对象进行操作是允许的。例如,视图允许监听由模型产生的事件;操作允许修改模型,但模型不应涉及视图或操作。

Models(模型)

这里以一个“User”对象为原型,它至少应用有一个Email地址,也可能有用户名和电话号码。

在一个MOVE模式的Models中只包装知识。这意味着除了Get和Set功能,它们可以包含检查用户密码是否正确这样的方法,但不会包含把密码保存到数据库或传递给外部API这样的功能,因为后面这些工作将由Operations来完成。

Operations(操作)

对应用程序来说,一个常见的操作是用户登陆。这实际上是由两个子操作组成:首先从用户那里获得邮件地址和密码,然后从数据库载入“user”模型并检查密码是否匹配。

Operations是MOVE模式中的行动者。它负责修改模型,在正确的时间显示正确的视图,以及响应由用户交互引发的事件。在一个分解良好的应用程序中,每个子操作都可以独立运行。

采用这种方式的操作有一点很令人振奋,即程序启动后,整个应用本身就可以被当作一个Operations。它会根据需要生成尽可能多的子操作,其中每个子操作都并行地运行。当所有子操作都完成时,程序也便退出。

Views(视图)

登陆页面即是一个视图,它负责显示一些文本框给用户。当用户点击“登陆”按钮时,视图将产生一个“loginAttempt”事件,其中包含用户输入的用户名和密码。

用户能够看到的内容,以及能感受到的互动都由视图提供支持。它们会以一种用户能理解的形式呈现应用反馈,同时还能将简单的用户交互转换成有意义的事件。更重要的是视图不会直接改变模型,它们只是向Operations发起事件,然后通过监听等待由模型发起的事件。

Events(事件)

当用户登陆时,视图会发起“loginAttempt”事件。在登陆操作完成后,“currentUser”模型会发起一个事件通知应用登陆状态已改变。

事件监听让MOVE(及MVC)实现控制反转,允许模型更新视图。这是一种强大的抽象技巧,允许组件互不干扰地耦合在一起。

为什么是现在?

当然,Conrad Irwin并不想被人认为自己是在暗示MVC模式很差,这种大型应用程序架构在过去的几十年里确实非常成功。不过几十年后的今天,新的编程技术已经变得越来越流行,所以你也会在使用过程中逐渐产生一些疑惑。

MVC模式确实很了不起,但它毕竟是几十年前为老的技术而设计。MOVE模式是在其基础上的升级,让你可以更好地利用当前已有的新工具。

  • 大小: 41 KB
来自: 36氪
22
3
评论 共 22 条 请登录后发表评论
2 楼 javagui 2012-07-05 22:10
事件,听起来有点类似消息广播,就像Android 的 Intent,这种思想早就有了
1 楼 beming 2012-07-05 18:31
....我一早就是这样子用了,很多处理总不能放到Controller,我是增加一个service层,MVCS!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 整数之和

    题号: 10505 时限:1000ms 限制内存:32768KB 题目: 描述 密码问题迎刃而解,即刻响起一串轻快的开机音乐,哈哈,手机终于可以使 用了!忽然,一个神秘的手机精灵从屏幕上出现了,她笑嘻嘻的问卡卡西:“卡 卡西,你是不是想见超人啊?”卡卡西迫不及待的点点头,手机精灵说:“那你 需要再回答我一个问题。请你随便报出一个正整数 n,我会即刻在手机屏幕上生 成一串由递增的不同的正整数所组...

  • 哈哈。终于找到问题了。写错方法了。呵呵

    今晚不错。改写了一个文件上传的类 UP_LOADCS.PAS  unit up_loadcs; interface uses  System.Collections, System.ComponentModel,System.IO,System.Web, System.Web.SessionState,  System.Web.UI, System.Web.UI.WebControls

  • 终于可以使用了

    前些日子看到javaeye上有很多有用的资料,随即注册了一个。没想到要3天以后才能使用正常的功能。呵呵,感觉这个规定不太人性化。初学java没多久,以后准备把自己的学习历程都写在这个博客上,希望热心的人多指点我一下。呵呵。 :) ...

  • 问题终于解决

    啊!!       面对面前的东西我大叫了一声,也许是多日来太郁闷了,真看到问题解决的时候,自己心里没有太大的惊喜和激动!    总结如下,做东西的时候要有自己的主见不能完全相信厂家的阐述,这次之所以耽误了这么长的时间,主要是小程的一些误导,老认为产生接收中断是不正常的,所以就走了一个弯路,也说明自己的经验不足吧。另外自己的代码写的还是有点问题,要多注意细节问题,要不就不会产生这样的结果!唉,

  • 两整数之和

    不使用运算符+ 和-,计算两整数a、b​​​​​​​之和。 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = 3 输出: 1 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sum-of-two-integers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请...

  • LeetCode-371. 两整数之和

    不使用运算符+ 和-​​​​​​​,计算两整数​​​​​​​a、b​​​​​​​之和。 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = 3 输出: 1分析:看见题目知道用位运算解决,但是具体操作并不熟悉,所以 含义Pascal语言C语言C#语言Java 按位与 a and b a & b ...

  • 在若干个整数中找到相加之和为某个整数的所有组合的算法

    给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合,例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合,它们的相加之和为4:4, 3+1, 2+2,2+1+1。 我用c#实现的,定义了一个栈来存放符合条件的数据。代码如下. 1 int a = 4; 2 int[] iArr = new i...

  • 昨天的问题终于解决了

    唉,真是太高兴了.昨天的问题终于解决了 原来是我在第一次写实体BEAN的时候,定义错了,然后就把它布署到JBOSS里面去了,以后我虽然写对了,但是我布署进JBOSS里的JAR文件还在那里,所以每次都会出错,以至于我重新安装了NB都会出错,唉,我当时怎么不重装一下JBOSS呢,重装JBOSS问题就可以解决了.不过现在我也没有重装JBOSS,只是把JBOSS下面的我以前布署的JAR文件删掉就可以了 其...

  • FreeTextBox的问题终于解决了

    FreeTextBox的问题终于解决了  这两天,FreeTextBox的问题一直困扰着我。这个问题在以前的文章中我已简单描述过。也就是在回复页面, 如果我用FreeTextBox代替TextBox,提交时却不能得到FreeTextBox中的内容。今天我终于找到了问题的真正原因,原来是.Text将ViewState关闭了。害得我走了很多弯路,我一直以为是MasterPages引起的,这两天一直在研

  • 终于3天到了, 哈哈,可以写字了

    越不容易得到的越珍惜 ? 是吗 ? 不是吧 !

  • 哈哈

    <br />这东西挺好的

  • 终于能用了

    郁闷了好多天,终天能用这个blog了,要不系统有问题,要不密码不行。为什么非得要在这里开个blog?“还是是因为这里风水好!”呵呵

  • 哈哈!又得一证!

    今天查了分,软件设计师上午考了55,下午考了50, 有些险,但基本应该能过了,哈哈!!!下一个目标就是我一直以来的理想了--------系统分析师!!!努力~~~~~~

  • 第十八章:一文掌握数组标记

    数组标记 一.桶标记 1.认识数组 数组是一种将数据有序存放的结构,通过一维数组的学习,相信同学们会感觉数组的使用是非常灵活的,原因无异于是因为数组里一个下标对应一个元素。例如 int a[5]={2,3,5,7,11},下标0对应的元素为a[0],下标1对应元素a[1]...,那么在将数组应用在生活或者学习场景中时,下标及其对应的元素就会有不同的含义。 2.桶标记引入背景: 这里有一个有趣的问题:从键盘输入5 个0-9 的数,然后输出0-9 中哪些没有出现过的数。例如,输入2 5 2 1 8 .

Global site tag (gtag.js) - Google Analytics