您的位置:首页 > 编程语言 > C#

用C#实现MVC(Model View Control)模式介绍

2010-06-23 08:48 561 查看
作者:Matthew Cochran December 12, 2005
原文地址:http://www.c-sharpcorner.com/UploadFile/rmcochran/MVC_intro12122005162329PM/MVC_intro.aspx?ArticleID=448db537-f236-497d-a16b-46c5d1141e3f

益处

在我们的开发项目中使用MVC(Model-View-Control)模式的益处是,可以完全降低业务层和应用表示层的相互影响。此外,我们会有完全独立的对象来操作表示层。MVC在我们项目中提供的这种对象和层之间的独立,将使我们的维护变得更简单使我们的代码重用变得很容易(下面你将看到)。

作为一般的习惯,我们知道我们希望保持最低的对象间的依赖,这样变化能够很容易的得到满足,而且我们可以重复使用我们辛辛苦苦写的代码。为了达到这个目的我们将遵循一般的原则“对接口编成,而不是对类”来使用MVC模式。

我们的使命,如果我们选择接受它...


我们被委任构建一个ACME 2000 Sports Car项目,我们的任务是做一个简单的Windows画面来显示汽车的方向和速度,使终端用户能够改变方向,加速或是减速。当然将会有范围的扩展。

在ACME已经有了传言,如果我们的项目成功,我们最终还要为ACME 2 Pickup Truck 和ACME 1 Tricycle开发一个相似的接口。作为开发人员,我们也知道ACME管理团队最终将问“这样是很棒的,我们能够在我们的intranet上看到它?”所有的这些浮现在脑海中,我们想交付一个产品,使它能够容易的升级以便能够保证将来我们能够有饭吃。

所以,同时我们决定“这是使用MVC的一个绝好情形”

我们的构架概要

好,现在我们知道我们要使用MVC,我们需要指出它的本质。通过我们的试验得出MVC的三个部分:Model,Control和View。在我们的系统中,Model就是我们的汽车,View就是我们的画面,Control将这两个部分联系起来。
public enum AbsoluteDirection
public enum RelativeDirection
public interface IVehicleControl
public interface IVehicleModel
public interface IVehicleView
public interface IVehicleControl
public interface IVehicleModel
public class IVehicleView
public abstract class Automobile: IVehicleModel

最后但不是至少

现在我们的"ACME Framework"已经做好了,我们只需要设立有形的类和接口。首先让我们看看最后两个类:ControlModel...

这里我们有形的AutomobileControl实现IVehicleControl接口。我们的AutomobileControl也将设置View来依赖Model 的状态(当有向Model的申请时检测SetView方法)。

注意,我们只是有对IVehicleModel的引用(而不是抽象类Automobile )和对IVehicleView的引用(而不是具体的View),这样保证对象间的低耦合。

public class AutomobileControl: IVehicleControl
public class ACME2000SportsCar:Automobile
public class AutoView : System.Windows.Forms.UserControl, IVehicleView
public AutoView()
public void WireUp(IVehicleControl paramControl, IVehicleModel paramModel)
private void btnAccelerate_Click(object sender, System.EventArgs e)
private void btnDecelerate_Click(object sender, System.EventArgs e)
private void btnLeft_Click(object sender, System.EventArgs e)
private void btnRight_Click(object sender, System.EventArgs e)
public void UpdateInterface(IVehicleModel auto)
public void DisableAcceleration()
public void EnableAcceleration()
public void DisableDeceleration()
public void EnableDeceleration()
public void DisableTurning()
public void EnableTurning()
public void Update(IVehicleModel paramModel)
public class ACME2000Truck: Automobile
private void btnBuildNew_Click(object sender, System.EventArgs e)
public void RequestAccelerate(int paramAmount)
public void RequestDecelerate(int paramAmount)

如果我们想让我们的ACME2000 Truck变得迟钝,只需要在AutoView中包装。

private void btnBuildNew_Click(object sender, System.EventArgs e)
{
this.autoView1.WireUp(new ACME.SlowPokeControl(), new ACME.ACME2000Truck(this.txtName.Text));
}

最后,如果我们需要一个在web上的接口,我们要做的所有工作就是建立一个Web项目在UserControl中实现IVehicleView接口。

结论

正如你所看到的,使用MVC来构建代码控制接口耦合性很低,很容易适应需求的改变。它也能使变化的影响减小,而且你可以在任何地方重用你的虚函数和接口。有很多时候我们可以在我们的项目中实现伸缩性,特别是在那些需求变化的时候,但是这需要下次再说了。

于此同时,做下一个项目的时候记住MVC...你不会感到遗憾!

Happy Driving.

if ($ != jQuery) {
$ = jQuery.noConflict();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: