MVC控制器(Controller)与策略模式(Strategy)
转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd
作者联系方式:Li XianJing <xianjimli at hotmail dot com>
更新时间:2006-1-11
MVC模式已经称得上是家喻户晓了,MVC是模型(Model)、视图(View)和控制器(Controller)的首字母缩写。与模型(Model)和视图(View)相比,控制器(Controller)的功能要小得多。正因为它太简单了,MFC甚至把MVC模式简化成文档(Doc)/视图(View) 模式,控制器(Controller)几乎是个透明人,很少有人提及它。
在典型的GUI应用程序中,控制器(Controller)就是事件处理函数,它仅仅是把模型(Model)和视图(View),或者视图(View)与视图(View)关联起来,一个简单的胶合层而已,如果MVC模型应用得好,控制器(Controller)只有少量的代码,所以常常被人忽视。
在《企业应用架构模式》中,Fowler先生说过,视图和控制器的分离,就不那么重要了。实际上,几乎Smalltalk的每个版本都没有让视图和控制器的实现分离。为什么你会想分离它们呢,经典的例子是支持可编辑和不可编辑的行为。可以在这两种情况下,用一个视图和两个控制器的实现,这里控制器是视图的策略(strateies)。…
可编辑和不可编辑的行为,主要是针对编辑器控制而言的,如果是针对整个窗口,完全没有必要,直接把窗口上各个编辑器设为只读的就行了。真正去写编辑器的机会并不多,在其它地方,用策略模式(strategy)来配置控制器(Controller)的机会更少。我也从来没有关注过控制器(Controller)。这几天在重构短信应用程序时,我发现有时在控制器(Controller)上还真有文章可作。
在我们的平台上,短信应用程序是邮件系统的一个子系统,完整的邮件系统包括短信、彩信和邮件三个子系统。每一个子系统都是一个插件,这样保证了三者的独立性,以便于裁减。短信应用程序基本功能已经可用了,下一步任务是设计彩信应用的架构和编写主要代码,我发现短信和彩信有很共通之处,决定对短信应用程序进行重构。
经过讨论,我们发现彩信和邮件的数据表完全可以统一起来,主要字段(field)有发件人、收件人、收/发时间、主题、状态和附件等等,而短信看似特殊一点,在仔细分析后,可以发现也就多了一个附件而已。当彩信和邮件没有附件时,它们与短信差不多一样,最后我们决定把三者统一起来,放在一张表中。它们的操作也差不多,于是把短信的模型(Model)改成一个通用的模型,在三者间共享。
短信、彩信和邮件的模型部分统一了,缩减了不少的代码。三者的编写和阅读界面差异很大,统一起来的可能性太小,不做统一的考虑了。但是列表界面则完全一样,该界面上的操作无非是删除、删除全部、查看、编写、回复、转发和设置等等,由于模型(Model)是统一的,删除和删除全部等处理完全一样,而查看、编写、回复、转发和设置等,不同的子系统处理不一样,要在控制器(Controller)中调用不同的函数。
列表界面的代码量并不大,但重复三次可不太爽。我决定重用这个视图,用策略(strateies)来配置控制器(Controller),控制器(Controller)定义了查看、编写、回复、转发和设置等几个接口函数,其实现也很容易,可以直接指向各个子系统的相关函数。其结构如下图所示:
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 270pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:/DOCUME~1/q/LOCALS~1/Temp/msoclip1/01/clip_image001.png" o:title=""></imagedata></shape>
重构之后,处理简化了,几乎没有重复代码,维护更容易。此外还有一个好处是,动态切换子系统速度更快,界面无闪烁。尽管这次重构对短信应用程序的架构做了很大调整,花了好几天时间,但我认为这是值得的。
~~end~~
分享到:
相关推荐
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的...
本文实例讲述了ASP.NET在MVC控制器中获取Form表单值的方法。分享给大家供大家参考,具体如下: 在MVC控制器中,如果我们想直接获取表单中某个标签元素的值,可以使用MVC中提供的FormCollection类,具体用法如下所示...
C#MVC控制器前后端传值
mvc模式mvc模式mvc模式mvc模式mvc模式mvc模式mvc模式mvc模式mvc模式
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。...
(5)asp.net mvc3控制器(Controller)以及Action 时长一个小时左右
MVC2中Controller向View传递数据的三种方式
在MVC框架中,控制器类必须实现System.Web.Mvc命名空间下的IController接口,如上图所示,这是一个非常简单的接口,该接口仅有一个Execute方法,当请求该控制器时Execute方法被调用。通过实现IController接口,你...
ASP.NET MVC学习笔记-Controller与View传值.
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 View...
MVC 设计模式 单例模式 MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。
这是一个简单完整的Spring MVC向导控制器(AbstractWizardFormController)的例子,包含所需的类包,可以运行,也是我重新熟悉Spring 的第二例子,明天再上传Spring 的例外个例子,如有问题,我们可以互相学习下.
mvc设计模式的讲解与使用 常见WEB开发语言的MVC框架 jsp+servlet+javaBean实现MVC –流程 jsp+servlet+javaBean实现MVC –技术点 PHP与JAVA在MVC模式上的不同之处 MVC设计模式的优势 MVC设计模式的缺点 MVC结构提供...
jsm controller调用js源码和dll,可以通过MVC的controller直接调用js的函数
Asp.net mvc 多层级 Controller Views 目录实现 的项目源文件,直接vs 打开即可运行的。
Spring MVC学习(四)-------Controller接口控制器详解1
Spring MVC学习(四)-------Controller接口控制器详解3
mvc控制器向视图传数据出现的错误信息,以及mvc中控制器向视图传值的四种方法 ,希望我能够给大家带来一点小小的帮助,如果有网友对我的有疑问的地方欢迎来私信我谢谢
【ASP.NET编程知识】asp.net MVC 在Controller控制器中实现验证码输出功能.docx
我对照网上一篇讲述MVC设计模式的文章,用VS2008的C#语言写的MVC设计模式例子程序。