MVC和MVVM

摘要:
商业模式的设计可以说是MVC最重要的核心。原理如上所述。现在直接应用代码。在MVC中,控制器已成为我们的中心。它负责将V的数据传输到M,获得结果,并更新尝试。在MVC中,经常使用委托,视图中的操作通过委托转发给Controller中的炫耀功能。当有结果时,视图中的函数更新界面将在Controller中调用。

提到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和MVVM第1张

上面说了原理,现在就直接上代码,在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和MVVM第2张

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

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

MVC和MVVM第3张

MVC和MVVM第4张

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

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

免责声明:文章转载自《MVC和MVVM》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Grafana数据可视化【Debian】时间设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql中的view(虚拟表)

视图是从一个或多个表/视图中导出来的虚拟表。mysql支持可更新的视图。 1 创建 CREATE [OR REPLACE] ##使用这个选项,若视图已存在,则等图create,若视图不存在,则等同alter [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = {...

处理百万级以上的数据提高查询速度的方法

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而...

Recordset属性与方法

Recordset属性与方法 关于分页:   首先,我们可以为 PageSize 属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过RecordCount 属性来确定记录的总数;再用记录总数除以 PageSize 就可得到所显示的页面总数;最后通过 AbsolutePage 属性就能完成对指定页的访问    ----------------...

laravel框架使用生涯

手工安装laravel http://laravelacademy.org/resources-download 1、将下载的文件复制到虚拟主机目录 2、在Apache的配置文件配置一个虚拟主机【注意,需要指向 public目录下】 <VirtualHost *:80> DocumentRoot "C:phpStudyWWWlarav...

1.AngularJS初探

1.需要什么前端开发环境 1)代码编辑工具 webstorm 2)断点调试工具 chrome插件Batarang 3)版本管理 tortoiseGit 4)代码合并和混淆工具   grunt-contrib-uglify     grunt-contrib-jshint     grunt-contrib-qunit     grunt-contrib...

Sql Server 优化的方法

<!--StartFragment-->查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这也是查...