原文:Introduction to Model View Control (MVC) Pattern using C# (第一次翻译计算机类的文章,很生硬,各位海涵:)) 好处 Benefits 通常我们都知道要让对象尽量减少之间的依赖关系,这样,我们努力编写的代码才容易修改。为了达到这种目的,需要遵循一个通行的原则采用MVC模式“在接口上编程,而不应该在类上编程”("programming to the interface, not the class" )。 我们的任务就是…… 我们接了个任务——ACME 2000 赛车项目,任务就是编个简单的交互界面,实现以下功能:1、显示车辆的当前方向和速度;2、让最终用户可以改变方向、加速、减速。当然,这些功能都是有一定范围限制的。 据说如果我们在这个项目上成功了,我们最后还要开发一个接口,实现类似的程序:ACME 2 皮卡和 ACME 1 三轮车 ACME 1 。做为程序员,我们了解ACME 的管理层最后会这样说“啊,非常棒!可以放到公司的网站上吗?”考虑到这些要求,我们要开发一个容易升级的产品,这样我们才能让顾客满意,才能有饭吃,哈哈。:) 我想,正好…… “这个机会正好用来实现一下MVC模式!” 架构概述
我们使用控制器来操纵模型(ACME2000运动型汽车),控制器将向模型发送请求,并更新用户接口——视图。这样看上去很简单。我们需要解决的第一个问题是:用户想让汽车跑得更快或者是转弯的话,要做些什么?答案就是通过视图(我们的程序窗口),借助控制器发送一个请求。
这样,用户(司机)就可以通过视图使用整个ACME汽车控制系统。如何用户想操纵这个系统,比如说加速,视图就会发出请求,并且由控制器来处理这个请求。控制器将把请求告诉模型,由模型来做出相应的动作,并且,控制器还将会更新试图。
然后,处理控制器接口。控制器要告诉模型如下请求:加速、减速、转向。我们增加一个包含合适的方法的汽车控制接口(IVehicleControl)。 public interface
IVehicleControl 接下来,处理模型接口。我们需要知道汽车的名字、速度、最大前进速度、最大倒车速车、最大转弯速度、方向。我们还需要如下方法:加速、减速、转向。 public interface IVehicleModel public class IVehicleView public interface
IVehicleControl public interface IVehicleModel public class IVehicleView public abstract class Automobile:
IVehicleModel public class AutomobileControl: IVehicleControl public class ACME2000SportsCar:Automobile public class AutoView : System.Windows.Forms.UserControl,
IVehicleView public
AutoView() 接下来,增加按钮、标签来显示ACME2000运动型汽车的状态,还有一个状态栏用作填充按钮的代码。 private void btnAccelerate_Click(object
sender, System.EventArgs e) 增加一个方法来更新用户接口…… public void UpdateInterface(IVehicleModel auto) 最后,实现汽车视图接口的方法…… public void DisableAcceleration() 搞定了!!! 在汽车视图里,我们只需要创建皮卡,并把它连接上去。 private void btnBuildNew_Click(object
sender, System.EventArgs e) 如何我们要创建新的控制器,这个控制器只允许最大5mph的加减速,好办!创建一个限定加减速控制器(SlowPokeControl,和汽车控制器一样,只多了个最大加减速的限制)。 public void RequestAccelerate(int
paramAmount) 如果我们想给ACME2000皮卡加上限定加减速功能,再连接到汽车视图里。 private void btnBuildNew_Click(object
sender, System.EventArgs e) 最后,我们想创建一个基于web的界面,需要做的就是创建一个web工程,并且在用户控制器实现汽车视图接口。 注意,使用指向汽车模型接口的引用(不是汽车抽象类)来保持松耦合,汽车视图也是这样。。通过实现汽车视图接口(IVehicleView)可以生成任何显示汽车状态的人机界面,而我们的汽车ACME可以通过实现汽车模型接口(IVehicleModel)来生成,再通过实现汽车控制器接口(IVehicleControl)来生成汽车的操纵器。 接下来……哪些是我们通常要做的? 我们制作的汽车都是一样的,所以,创建一个共同的框架来处理各种操作。因为我们不想让别人驾驶一个框架,所以就要使用一个抽象类(不允许创建抽象类的实例)。我们把这个抽象类叫做汽车(Automobile)。可以使用队列列表(System.Collections中的ArrayList)来跟踪所有的视图(还记得观察者模式吗?)。当然也可以使用一个旧的汽车视图平面队列,但我们有太多的文章将这方面的东西可供参考。如果有兴趣研究汽车模型接口和汽车视图接口是如何交互的,可以研究一下如下方法的实现:AddObserver, RemoveObserver, and NotifyObservers。每当速度或方向发生变化时,模型将通知视图。用NotifyObservers方法,把指向视图的引用传给自己,并调用视图的Update方法来通知视图进行相应的变化。控制接口中增加如下方法:设置模型(SetModel)和设置视图(SetView)。 |
|