[置顶] 强化版mvc设计模式

一、原始mvc模式简略图:
[置顶] 强化版mvc设计模式_第1张图片
    
原理介绍:
一、 “主动—MVC”模式,也是通常意义下的MVC模式
1、视图 并不使用 控制器去更新模型,控制器负责处理从视图发送过来的用户操作并通过与模型的交互进行数据的更新。
2、 控制器可以和视图融合在一块。Visual Studion中对Windows Forms的默认处理方式就是这样的。 【译注:比如我们双击一个Button,然后在它的事件里写处理逻辑,然后将处理的数据写回模型中。这里处理逻辑时间应该是控制器的功能 ,但是我们并没有专门写一个控制器来做这件事情而是接受了VS的默认处理方式,将它写在Form的代码中, 而这里的Form在MVC中它就是一个View。所以这说vs默认的处理方式是将把控制器和视图融合在一起的。】
3、控制器不包含对视图的渲染逻辑(rendering logic)。

二、“被动—MVC”模式
1、模型对视图和控制器一无所知,它仅仅是被它们使用。
2、控制器使用视图,并通知它更新数据显示。
3、视图仅仅是在控制器通知它去模型取数据的时候它才这么做。
4、控制器负责处理模型数据的变化。
5、控制器可以包含对视图的渲染逻辑。

缺点:
1、在MVC中View会从直接Model中读取数据而不是通过 Controller,View是可以直接访问Model的! 从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑,Model不依赖于View, 但是View是依赖于Model的。
2、如果view可以操控model,有一些业务逻辑可以在View里实现,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

 二、mvp模式简略图:
    

原理介绍:
      与“被动—MVC模式”很接近,区别在于“ 视图并不使用模型 ”。在MVP模式中视图和模型是完全分离的,他们通过Presenter进行交互。
    Presenter与控制器非常相似,但是它们也有一些的区别:
1、Presenter处理视图发送过来的用户操作(在MVC中视图自己处理了这些操作)。
2、它用更新过的数据去更新模型(在被动MVC中控制器只是通知视图去更新过的模型中去取新的数据,而主动MVC中模型通知视图去更新显示,控制器不需要做工作)。
3、检查模型的更新(与被动MVC一样)。
4、(与MVC的主要区别)从模型中取数据然后将它们发送到视图中。
5、(与MVC的主要区别)将所做的更新告知视图。
6、(与MVC的区别)用Presenter渲染视图。

优点:
1、模型与视图完全分离,我们可以修改视图而不影响模型。
2、可以更高效地使用模型,因为所以的交互都发生在一个地方——Presenter内部。
3、我们可以将一个Presener用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

缺点:
1 、 由于对视图的渲染放在了Presenter中,所以视图和Persenter的交互会过于频繁。

2、 如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密,一旦视图需要变更,那么 Presenter也需要变更,Presenter的复用性不强。

  
三、优化后的mvc event框架:
[置顶] 强化版mvc设计模式_第2张图片

1、优化后mvc框架介绍:
    【1】、M在自己的基础上抽出部分方法成IModel的接口;
    【2】、C持有着model以及IMdoel引用,C负责业务逻辑的处理,改变model及事件分发与通知UI变化;
    【3】、V可以看到Controller 以及 model的接口,但这个接口内只有部分get方法;
    
2、针对mvc 与 mvp 的问题上做了改造:
    【1】、将model与view完全分离,解决了原始mvc中view直接操控model的问题,只有Controller有操作model的权限,这样将所有业务逻辑处理放到了Controller层;
    【2】、Controller只负责将model的数据提供给View层,视图的渲染是在View层做的,这样大大降低了Controller的工作量,分工更加明确,Controller与View交互不在那么频繁;
    【3】、Controller通过event事件将数据返回的消息传送给View层,View层接收到消息去IModel接口中拿数据,这样也比Controller强制渲染View要通用的多,这样总比回调接口,写死的参数要好得多,大大提高了Controller的复用性;
    【4】、针对扩展性而言,mvp模式下 Presenter拿到数据后调用了view提供的接口,那么开发时下次有新的需求变更时,View要变,接口要变,Presenter也要变,而如果采用event事件的话,只要Event事件命名不发生变化,代码变动较小;

3、mvc event 时序图:

[置顶] 强化版mvc设计模式_第3张图片

4、具体代码以上传到githup上,如想了解需要请前往查阅,如有疑问希望及时沟通。
      https://github.com/walid1992/StrongMVC

你可能感兴趣的:([置顶] 强化版mvc设计模式)