求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
设计模式应用实例--基于Command模式和MVC构建系统架构

2010-08-27 作者:RayGu 来源:博客园

 

看过一些设计模式的书,不喜欢这种很多书上的举例方式,拿个什么事件,或者物体来举例。我认为这只是教科书,即便是背熟了,也只是背熟了而已,能融会贯通的使用吗,我想通过几个例子来阐明设计模式在实际项目开发中的应用。

首先要说的是MVC模式,我不想再重复详细的描述什么是MVC,MVC的特点等等,需要了解这些知识的人,另外找资料了解,我只是准备用一个思想付诸于MVC的实现。当然,我也会简单的说,MVC就是模型,试图,控制器的组成,MVC的特点是各施其职,互不干涉。

好了,接着,我再提出一个设计模式,Command模式,或许了解这个模式的人比了解MVC的要少很多,没关系,可以百度,看看什么是Command模式,当然也可以看看类似教科书对Command模式的描述。我只是简单的说是解耦接收者和发送者的联系。其实就是"第三者",至于详细的我就不多说了。

好了,下面通过一个大型项目的简化举例,来表明,如何使用Command模式和MVC模式构建所谓的三层架构。该项目的原型是一个跨国公司的小型ERP系统。所以,我会用其中一个模块来阐述实际应用。当然这个模块会是信息管理系统中的常用模块。

新建解决方案,为了演示方便,所以我是这么新建的。

只是为了从字面上说明,这个是基于MVC来构建的。

接下去在View模块中,我新建一个View,员工管理的页面,我想这也是任何一个信息系统所必须要使用到的模块。

ViewStaffManager -- View

Staff -- Model

Staff -- StaffList

BaseController -- Control

Command -- Control

CommandGetStaff -- Contro

以上是对这个项目演示的基本功能建立。

接下去,一部一部实现功能。

首先介绍业务对象,Model的开发。

以下是业务实体类

using System;
using System.Collections.Generic;
using System.Text;

namespace Model
{
    /// <summary>
    /// 员工业务类演示。
    /// 
    ///     <Developer>Ray Gu</Developer>
    ///     <DateTime>2009.04.12</DateTime>
    /// </summary>
    public class Staff
    {
        private string id;
        /// <summary>
        /// 唯一主键
        /// </summary>
        public string Id
        {
            get { return id; }
            set { id = value; }
        }
        private string userName;
        /// <summary>
        /// 员工名称
        /// </summary>
        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
        private string tel;
        /// <summary>
        /// 联系电话
        /// </summary>
        public string Tel
        {
            get { return tel; }
            set { tel = value; }
        }
    }
}

业务实体集合类

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace Model
{
    /// <summary>
    /// 员工对象集合类
    /// 
    /// 为了只是说明演示,所以做简化,不通过数据库访问来实现功能。
    /// 
    /// 
    /// 
    /// 
    /// </summary>
    public class StaffList : List<Staff>
    {
        public List<Staff> GetList()
        {
            // 该加载数据演示过程实质是通过数据库访问层,获取数据,为简化演示,故只在虚拟数据集中添加数据
            DataTable dt = new DataTable();
            dt.Columns.Add("编号");
            dt.Columns.Add("名称");
            dt.Columns.Add("电话");
            DataRow dr = dt.NewRow();
            dr["编号"] = "100001";
            dr["名称"] = "张三";
            dr["电话"] = "057487301122";
            dt.Rows.Add(dr);
            dt.AcceptChanges();

            Staff myStaff = null;
            foreach (DataRow row in dt.Rows)
            {
                myStaff = new Staff();
                // 实际开发中强烈不建议使用索引为数字的形式出现,对维护产生极大不便。
                myStaff.Id = row[0].ToString();
                myStaff.UserName = row[1].ToString();
                myStaff.Tel = row[2].ToString();
            }
            this.Add(myStaff);
            return this;
        }
    }
}

接下去,做控制器,控制器其实就是一个Command模式。

using System;
using System.Collections.Generic;
using System.Text;

namespace Control
{
    public class Command
    {
        public abstract object Execute();
    }
}

控制器执行基类。

Code

using System;
using System.Collections.Generic;
using System.Text;

namespace Control
{
    public class BaseController
    {
        public object ExecuteCommand(Command myCommand)
        {
            return myCommand.Execute();
        }
    }
}

Code

using System;
using System.Collections.Generic;
using System.Text;

using Model;

namespace Control
{
    public class CommandGetStaff : Command
    {
        public override object Execute()
        {
            StaffList list = new StaffList();
            return list.GetList();
        }
    }
}

之所以要做控制器的实质就是第三者的作用,通过控制器来控制模型和视图的链接。

继续做下页面。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using Control;
using Model;

namespace View
{
    public partial class ViewStaffManager : Form
    {
        BaseController control;

        public ViewStaffManager()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            control = new BaseController();
            CommandGetStaff getStaff = new CommandGetStaff();
            this.dataGridView1.DataSource = (StaffList)control.ExecuteCommand(getStaff);
        }
    }
}

以上就是实例的基本思想。以及对Command模式和MVC模式的应用介绍。

在之后下一篇,我想介绍下单件模式在实际开发中的应用,也准备对反射工厂模式做一下演示。

我做这个演示的目的不是为了说明设计模式的概念,而是我自己对设计模式应用的举例。

当然实际项目中的复杂度高于该实例百倍。但是基本的核心思想就是如此。

附上实例源代码下载,有兴趣的可以读一下。

我希望自己成为IT精英,而不是代码工人。



如何向妻子解释OOD
OOAD与UML笔记
UML类图与类的关系详解
UML统一建模语言初学
总结一下领域模型的验证
基于 UML 的业务建模


面向对象的分析设计
基于UML的面向对象分析设计
UML + 嵌入式系统分析设计
关系数据库面向OOAD设计
业务建模与业务架构
使用用例进行需求管理


某航空IT部门 业务分析与业务建模
联想 业务需求分析与建模
北京航管科技 EA工具与架构设计
使用EA和UML进行嵌入式系统分析
全球最大的茶业集团 UML系统分析
华为 基于EA的嵌入式系统建模
水资源服务商 基于EA进行UML建模
更多...