龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

学习.NET架构设计系列:Model–View–Controller(MVC设计模式)(3)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
当我们想执行保存动作的时候,就这样做: Commandcmd = new SaveCommand(); cmd.Execute(); 当我们想删除的时候,就调用DeleteCommand对象: Commandcmd = new DeleteCommand();

当我们想执行保存动作的时候,就这样做:

Command cmd = new SaveCommand(); 
cmd.Execute(); 

当我们想删除的时候,就调用DeleteCommand对象:

Command cmd = new DeleteCommand(); 
cmd.Execute(); 

执行不同的任务的时候,只有创建的命令对象类型是不一样的,执行过程都一样。如果用一个工厂封装创建Command对象的业务逻辑,就可以用完全相同的调用方式执行不同的任务。这个模式可以使我们在程序中扩充新的功能,而不对已经完成的功能造成影响。命令模式在很多系统里面广泛的使用,比如在Tomcat Web服务器中,当我们访问一个JSP页面的时候,Tomcat会把这个JSP编译成HttpJspBase类的一个子类,然后调用他的_jspService方法,执行我们自己编写的页面代码。这就是一个命令模式。

下面我们来看看刚才提到的图形界面是如何实现的,并且通过什么样的方式调用后台的业务逻辑层进行实际的工作。示例代码可以在这里下载:http://files.cnblogs.com/lane_cn/skii.zip。这是用Visual Studio 2003编写的一个项目。项目代码分为三个包。打开项目文件可以看见三个对应的文件夹:

1、AfricaTelecom:这个文件夹里是“非洲通信公司账务管理系统”的业务代码,业务逻辑层的对象都在这里面;

2、View:这里是视图。其中的BaseView是所有视图的基类。还有两个实际的视图PayMoney和ChangePrice,分别是用户缴费视图和资费变更视图。ViewFactory是建立视图实例的工厂;

3、Action:这里是程序中所有的行为,是控制器的重要部分。其中的BaseAction是所有行为的基类,ActionFactory是建立行为对象的工厂,其余的行为是分别用于用户缴费和资费变更等各项业务活动。

我们先来看看View(视图)。BaseView是一个用户控件,从他的定义可以看出来:  

public class BaseView : System.Windows.Forms.UserControl 

 

我们为BaseView定义了Id和ViewName两个属性,用来标记系统中的所有视图。BaseView向外界提供了一个“视图属性”接口,调用者可以使用这个接口把一些“名-值”对保存到视图中: 

private Hashtable attributes = new Hashtable();

/// <summary>
/// 视图属性
/// </summary>
public object GetAttribute(string key)
{
    
try 
    {
        
return this.attributes[key];
    }
    
catch
    {
        
return null;
    }
}

/// <summary>
/// 视图属性
/// </summary>
/// <param name="key"></param>
/// <param name="valuee"></param>
public void SetAttribute(string key, object valuee)
{
    
try 
    {
        
this.attributes.Remove(key);
    }
    
catch {}
    
this.attributes.Add(key, valuee);
}

视图提供了UpdateView和UpdateAttributes两个方法,用于把attributes容器里的“名-值”对显示到界面上,或者把界面上的文字保存到attributes容器中。这两个方法需要在子类中覆盖。

视图还向外界提供了两个事件:Change和MessageOut。Change向外界发出“视图已经被改变”的事件,这个事件可以用来实现这样的功能:在工具栏上有一个“保存”按钮,当视图打开时,这个“保存”按钮是不可用的,一旦视图发生变化,就会发出Change事件,于是工具栏可以捕捉到这个事件,将“保存”按钮设置为可用状态。MessageOut用于向外界发出消息,可以随时向外界通知某个任务的执行状态。

程序的主画面(MainWin)提供了一个LoadView方法,这个方法可以在窗体右侧区域加载一个视图,所加载的视图一定是BaseView的某个子类:  

/// <summary>
/// 打开视图
/// </summary>
/// <param name="view">视图</param>
public void LoadView(Skii.View.BaseView view) 
{
    
this.panel1.Controls.Clear();
    
    view.Dock 
= System.Windows.Forms.DockStyle.Fill;
    
this.panel1.Controls.Add(view);
    
this.SetActiveView(view);
    
    
this.statusBar1.Text = this.GetActiveView().GetName() + "就绪";
    
this.Text = "SkII - " + this.GetActiveView().GetName();
    
    
this.GetActiveView().MessageOut += 
        
new ViewMessageHandler(ActiveView_MessageOut);
    
this.GetActiveView().Change += 
        
new ViewChangeHandler(ActiveView_Change);
}

窗体右侧有一个面板控件:panel1,LoadView方法首先把面板上的控件全部去掉,然后把视图对象放到面板上。视图添加上去之后,更新主窗体的ActiveView属性,修改状态栏和窗体标题上的文字。最后再为MessageOut和Change事件设定响应函数。

MainWin向外界提供了一个静态的Instance属性,调用者可以通过这个属性得到主窗体的实例引用,然后调用LoadView方法。

下面我们再来介绍控制器。打开Action目录,BaseAction是所有Action的基类,他有Id和ActionName两个属性,用于标示系统中的行为。BaseAction有Enabled和IsVisible两个属性,分别表示行为是否可用、是否可见。


精彩图集

赞助商链接