您的位置:首页 > 其它

关于MVC的一些理解

2011-04-18 11:32 260 查看
1. API的复用是微观层面的复用,MVC里面Model的复用是宏观层面的可复用,两个关注的复用点不一样的。举例说明:Windows API和MFC,一个是底层,一个是框架。差别在哪里呢?用线性代数类比的话,API提供的就是基向量,而MFC提供的则是基向量的各种组合。也就是说,凡是你用MFC能完成的事情,用API都能完成,但是这需要你自己重头组合一次,效率一般就比不上MFC(我说的是一般情况);但是你用MFC搞不定的事情(Windows平台),那么就非API不能完成,因为MFC不可能提供所有的基向量组合。这就需要你自己来设计怎么用这套API组合出具体的业务逻辑。
一个设计的好的库,一定要包括基本的API,也就是基向量,能让你在这个平台上无所不能;同时也要提供各种丰富的框架,也就是各种基向量的组合,能让你最大限度避免重复造轮子。
MVC模式中Model就是组合后的基向量。各种不同的业务逻辑都有不同的Model,而基本的API不可能穷尽这些Model(而且这也不是API应该做的事,API只负责提供基向量,提供接口,组合则是由程序设计者完成)。所以MVC里面的可复用就是这个意思。
2. 你讲的没有错,确实就是类库了。因为MVC里面的M就是针对特定业务领域利用基本的API进行的逻辑组合。web领域如此,其他领域如果适合的话,同样可以用这个方式进行组合。而且请注意一点,个人认为MVC模式的最大优点不在于可复用,因为它本身是API的组合,复用性再高也高不过API,所以不如说是“减少重复劳动”更为妥当。MVC的最大优点,个人认为是解耦。也就是把业务逻辑和它的表现方式分离,让Model不依赖于View的变化,或者至少让两者可以独立变化,不至于View变了,导致连Model的接口也要跟着改。因为针对具体的业务逻辑,Model一般是相对稳定的,而View则是易变的。程序设计者地职责,就是封装这种变化,把变化带来的改动降低到最少。MVC提出来的出发点主要是为了解除Model和View的耦合,复用性则是第二位的。只有耦合度最小,维护成本才能最低。解耦的方式有很多,MVC不过是众多方式中表现的比较出色的一种而已。所以建议理解MVC的时候,应该主要从使用的目的上来理解,如果不清楚目的而使用的话,其结果就是我们经常谈到的“为模式而模式”,也即是“模式误用”,效果还不如不用这个模式。
3. 关于模型中数据的变化,7楼已经解释的非常清楚了。你要理解MVC这种机制的话,就首先要理解“观察者模式”。只有理解了这个模式你才能知道MVC中的M为什么是这个样子而不是其他样子。
如果View是上层的话,Model就是底层。一般而言,都是上层来调用底层的API。但是在某些时候,底层可能需要反过来回调上层的接口,这样就是一种双向依赖。MVC里面的M之所以使用观察者模式,就是为了最大限度解除这种依赖(请注意是最大限度,而不是完全消除,因为不可能100%的消除)。具体的做法,就是为View定义一个回调的接口,然后在模型中保存下来(C++里面的一种经典实现方式就是函数指针);等到Model的数据发生变化了,而此时又需要及时在View上表现出这种变化的时候,就利用这个回调接口通知具体的View来完成更新。至于这个回调接口是怎么实现的,则是View的职责了,Model只需要负责通知到View就OK了。
举例说明的话,如果你是领导,开会的时候的稿子一般都不会亲自写,而是通知你的秘书完成,具体怎么写出来的你不需要关心,你只负责通知秘书就OK了。所以秘书是领导背后的脸(View),领导则是真正的策划者(Model)。


--------------------------------------------------------------------------------------------------------------------------------------

一点理解,共参考。

考虑这样两个case,统计人口分布[0-20,21-40,41-60,大于60],统计人口地区分布[beijing,上海,etc]
1,如何获得各区间的人数,及在总人数的比例。这个是M的工作。
2,如何显示这个比例,用表格,圆,图等形式来显示。这是V的工作。
3,何为重用,如果你一开始开发一个“显示百分比的图程序”,只是给人口分布用的。但如果有一天,boss让你统计各员工来之什么地方。那你开发的“显示百分比的图程序”就可以直接在这里直接使用了。
4,模型变化,这个变化是外部通知M的。假如我们上面员工分布例子的例子中,有一个Table View,里面用户的信息。假如我们认为加人表示来了新人,删人表示离职。那我们的在View上的add,delete操作就要通知Control,Control就要通知M。这就是你想说的哪个模型变化。
5,模型收到变化信息后,就可以直接通知注册的V,V收到后就可直接修改显示,而不用关心具体的变化数据。
6,灵活性,这个模型你想加几个View都可以,只要注册到M上就可以。表格看的不爽,可以加个图表示的,页可以加个用柱子来表示的。

---------------------------------------------------------------------------------------------------------------------

模型(Model),视图(View)和控制Controller)
我来试着给你解脱一下,
模型(Model)一般指的是 业务模型 + 数据模型
视图(View)其实是一种结果的表现形式
控制(Controller)用来接收请求,并作出给予何种回馈的决策。

1.先讲重用(其实您这里理解的重用是狭义的代码/函数复用)
打比方:打比方你报考一所大学(分数能上),
a.大学收到你的志愿(请求)
b.大学招生办(控制)它会请求学校里很多部门协调作出决定(业务逻辑)。
c.大学招生办根据这个决定给你回复。
被录取/未录取
i: 招生办可能打电话通知你被录取了
ii: 招生办可能通过写信告诉你,你被录用了
iii:招生办可能通过电子邮件告诉你,你被录取了

招生办通过什么手段通知你,这便是一个控制。
你得到信息的表现形式,便是一个视图。

就这么多先
-----------------------------------------------------------------------------------------------------------------------------

均转于:http://topic.csdn.net/u/20110414/15/b8023d2d-9569-4323-93bb-032073e81370.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: