zoukankan      html  css  js  c++  java
  • MVC和MVVM

    提到MVC,编程的人都会知道,我说的多了,就变成了啰嗦,MVC这个名词,是在大三的时候接触,但是没用过,当时我是以看书为主,很少动手,大四实习的时候,项目经理安排一个程序,让我按照MVC的方式去写,因为当时我是给已有的系统扩充功能,公司的系统有自己的框架,我只是照猫画虎,并没在意,功能实现了,就草草了事。

    工作了,自己回头看以前写的代码,惨不忍睹,一个类中甚至有上千行,自己看起来都费劲,更何况别人,都是是控件的事件下面去写,很少考虑复用,这那里是写代码呀?跟填空题有什么区别?编程是一种技巧,又是一种艺术,其实在编程的时候可以享受编程带来的快乐的,如果像以前那样,一个事件下面一个功能,那人人都可以这么做了,编程和不编程的人的区别就在于,谁的代码中充满了艺术,能将复用,解耦,封装等OO的特点发挥的淋漓极致,看看我们用到的框架,简单的几个配置就可以让程序“活”起来。于是重新拾起MVC,拾起设计模式等内容。

     接着我以往的操作去说,我们看到的界面,也就是视图,在一个控件的事件中直接写功能,比如,计算一个加法,我只需要在加法的按钮的单击事件中写求和的代码,我们将这称之为一个求和的请求,然后单击事件响应了,如果界面上的操作较多,而我们的功能代码都按照刚才的方式,那么界面所在的.CS文件,将非常庞大,而且混乱,这种操作,也可以说是以视图为中心,如果采用MVC,可以将实现过程移到另外一个类中,视图将不再是中心,视图只是负责响应事件,然后获取界面上的数据,通过另外一个类转发,这个求和操作,可以认为是我们的数据逻辑,或者业务逻辑,是放在另外一个类中,Controller通过操作这个具有业务逻辑的类获取结果,然后用这个结果去更新界面。

    其实上面的描述已经说明了我这篇博文要说的东西MVC.下面我具体介绍下MVC

    MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
    视图

      视图(View)代表用户交互界面。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。

    模型

      模型(Model):业务逻辑和数据模型。业务逻辑其实就是我们业务的一个处理流程,M中封装了我们的业务流程的操作,对其它层来说是一个类似黑箱的操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。

    控制

      控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。

    关于MVC,我们可以从下面的图看出来。

    上面说了原理,现在就直接上代码,在MVC中,Controller成了我们的中心,负责将V的数据传递给M,然后获取结果,并更新试图,在MVC中,经常会用到委托,通过委托将视图中的操作,转发给了Controller里卖弄的函数,当有结果的时候,在Controller中回调View中的函数更新界面。

      public class controller
        {
           public MVC SumMVC { get { return m_MVC; }}
    
           private MVC m_MVC;
            public controller()
           {
               if (m_MVC == null)
               {
                   m_MVC = new MVC();
                   m_MVC.SendClick += new ClickEventHandler(m_MVC_SendClick);
               }
               datamodel = new model();
           }
    
            void m_MVC_SendClick(object sender, MyArgs e)
            {
                double c = e.A + e.B;
                m_MVC.SetInfo(c);
            }
       
           public  model datamodel { get;private set; }
    
            public double GetRes()
           {
               return datamodel.sum();
           }
          
    
    public class MyArgs : EventArgs
        {
            public double A { get; set; }
            public double B { get; set; }
        }
    
     public class model
        {
           
            public double A { get; set; }
            public double B{ get; set; }
            public double sum()
            {
                return A + B;
            }
        }
    
     public delegate void ClickEventHandler(object sender,MyArgs e);
        public partial class MVC : Form
        {
            public event ClickEventHandler SendClick;
                 public MVC()
            {
                InitializeComponent();
                        }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (SendClick != null)
                {
                    MyArgs pArgs = new MyArgs();
                    pArgs.A = Convert.ToDouble(textBox1.Text);
                    pArgs.B = Convert.ToDouble(textBox2.Text);
                    SendClick(this, pArgs);
                }
               
            }
            public void SetInfo(double a)
            {
                textBox3.Text = a.ToString();
    
            }
        }
    

     

    在上面的这个MVC实现过程中,我们发现在视图中还有部分代码,这部分代码的存在时因为响应界面的的事件获取界面的数据并用来更新,但是这里并没有计算的逻辑,这部分已经被移动了,能不能将这部门代码也移除?

    在WPF中的MVVM就只这么做的,在MVVM中,视图中是不存在任何跟事件相关代码的,而是通过绑定,而操作是被封装在一个称之为ICommand的类中,在ICommand中执行的操作代码是在VM中,在VM中,一般都会实现 INotifyPropertyChanged接口,这个接口就是将变化的数据赋给View中通过绑定而获取的信息,在和View相关的cs文件中,我们要做的就是将VM的实例赋给DataContext。关于MVVM的结构图如下:

    关于MVVM的代码,我这里没有准备,但是网上很多,可以动手找下。

    推荐一篇英文的博客:http://www.cnblogs.com/piaopiao7891/archive/2012/09/04/2670390.html

  • 相关阅读:
    大文件上传插件
    大文件上传解决方案
    up7-文件保存位置
    up6-自定义文件存储路径
    up7.1-asp.net-本地测试教程
    文件上传控件产品比较
    IIS支持解析json
    IE8控件安装方法
    IE9控件安装方法
    gets()函数详解和缺陷
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/3053560.html
Copyright © 2011-2022 走看看