简单的MVP框架搭建

1.MVP框架介绍:

最近公司内部培训,正好理一下项目的架构,目前最主要的产品还是用的MVP软件设计模式,就顺便查查资料来做个总结。

1.1什么是MVP?

MVP是Model-View—Presenter的缩写,从网上找到的资料来看,大多数时候,对于MVP的介绍还是基于MVC,关注点基本上就集中在Presenter上面了,wiki上有个简单的说明(MVP模式),先从定义来大概理解下这个模式:

1.2MVP各自的使用规则和相互的交互

这三个模块,一般情况下,对于view的理解是没什么争议的,就是界面展示;关于Model和Presenter的功能,还是有些争议,简单的来说,一个是业务逻辑,一个是界面控制逻辑,但是实际定义的时候可能就没那么清楚了,关于这两个模块定位的区分,我看到了一篇比较有用的文章,虽然是MVC的,但是原理是差不多的(点这里查看原文):

   实体对象(entity object):
       通常是来自域模型中的对象(也就是现实世界),它常对应于数据库表和文件,这些数据表
   和文件中存储了执行用例所需的数据。有些实体对象是“临时”对象(如搜索结果),当用例
   结束后将消失。

   边界对象(boundary object):
       参与者使用它来同系统交互,这通常包含窗口,屏幕,对话框和菜单。如果有GUI原型,
   将会知道许多主要的边界对象是什么。

   控制对象(control object):
       将边界对象和实体对象关联起来(通常被称为控制器,因为它们通常不是真正的对象),
   它包含了大部分应用逻辑,它们在用户和存储的数据之间架起一座桥梁。控制对象中包含经常
   修改的业务规则和策略。这样修改只需要在这些对象中进行,而不会涉及到用户界面和数据库
   模式。控制器偶尔 (20%的时间内)也会是设计中的“真正对象”,但大部分时间内,控制器只
   是一个占位符,用于避免您遗漏用例要求的任何功能和系统行为。

  关于这三个模块的交互,可以用一张图来体现:

  

  Presenter做为Model和View的中间层,维护页面操作状态,从Model获取数据,百度百科里用的图Presenter和model之间是双向绑定的,有点没看懂,原则上,Model是不会处理Presenter的。

1.3关于MVP的一些概念上的问题

我之前对于Model的理解是有些误差的,不管是MVC还是MVP,我之前以为Model是数据模型,只是数据库交互的相关操作,这本身应该算是对Model的一种弱化,实际上,参考微软提供的MVCScore的示例项目(下载链接)可以发现,Model并不是通常意义上跟数据库中表的对应,对应的其实是后台的Service这部分,Model作为业务逻辑模型,应该承担更多业务处理工作,这样才是把业务和页面展示分开,实现前台页面和后台逻辑的解耦。

  当然,软件设计模式不是标准,只是一个解决特定方案的相对合理化方案而已,解耦也不是软件设计的唯一标准,甚至不是最重要的标准。

1.4MVP模式的一般实现方式

目前我的项目中的实现方式是用接口来连接view和Presenter,根据定义好的接口来进行分块开发,如下图:

  

接下来是做一个小的demo来实际明确一下各部分的功能:

2.MVP的demo

2.1这个demo的具体使用场景和简单设计

  我还是想把这个demo做成一个持续优化的项目,对于一个正式一点的项目,登录页面一般都是网站的第一步,这个demo就先做一个登录页面,暂时不考虑数据交互,MVP都定义最简单的形式,获取角色,输入用户名密码,登录。

2.2详细设计

  分模块定义:

  2.2.1 数据实体类项目(Data):添加角色类和用户信息类

  2.2.2 数据业务逻辑模型项目(Model):添加一个登录验证类,添加获取角色信息和用户登录两个方法

  2.2.3 界面业务逻辑操作项目(Presenter):这里有两部分的内容:1.接口定义;2.页面处理逻辑。通过定义委托和接口中的属性来控制页面上的事件和数据。

  以前一直以为Model包括Data和Dao,所以一直不理解,为什么说Model和View没有通讯,实体类肯定是贯穿整个解决方案的,view就不说了。       

2.3各个部分的实现

  Data项目:  

public class RoleInfo
    {
        public string RoleName { get; set; }

        public string RoleID { get; set; }
    }

  

public class UserInfo
    {
        public string RoleID { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }
    }

  Model项目:

/// <summary>
    /// 权限管理
    /// </summary>
    public class Authority
    {
        /// <summary>
        /// 初始化方法
        /// </summary>
        public IList<RoleInfo> GetRoleList()
        {
            IList<RoleInfo> roleList = new List<RoleInfo>();
            roleList.Add(new RoleInfo() { RoleName = "管理员", RoleID = "1" });
            roleList.Add(new RoleInfo() { RoleName = "操作员", RoleID = "2" });
            roleList.Add(new RoleInfo() { RoleName = "一般用户", RoleID = "3" });
            roleList.Add(new RoleInfo() { RoleName = "VIP用户", RoleID = "4" });
            return roleList;
        }

        public bool Login(string userName, string password)
        {
            return true;
        }
    }

  Presenter项目:  

public delegate bool LoginEvnet(string userName,string password);
    /// <summary>
    /// 登录窗口需要实现的接口
    /// </summary>
    public interface ILoginView
    {
        IList<RoleInfo> RoleList { set; }
    }

/// <summary>
    /// 权限管理
    /// </summary>
    public class LoginPresenter
    {
        private ILoginView _view;
        private Model.Authority authority;
        public LoginPresenter(ILoginView view)
        {
            _view = view;
            authority = new Model.Authority();
        }

        /// <summary>
        /// 登录方法
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public bool Login(string userName,string password)
        {
            return authority.Login(userName,password);
        }

        /// <summary>
        /// 初始化方法
        /// </summary>
        public void Init()
        {
            _view.RoleList = authority.GetRoleList();
        }
    }

  页面后台代码,负责绑定事件和更新页面控件属性:

public partial class LoginView : System.Web.UI.Page, ILoginView
    {
        private LoginPresenter presenter;
        protected void Page_Load(object sender, EventArgs e)
        {
            presenter = new LoginPresenter(this);
            presenter.Init();
            btnLogin.Click += delegate {
                    if (presenter.Login(txtUserName.Value, txtPassword.Value))
                    {
                        //登录成功
                        this.ClientScript.RegisterStartupScript(typeof(string), "js", "alert(‘登录成功!‘);", true);
                    }
                    else
                    {
                        this.ClientScript.RegisterStartupScript(typeof(string), "js", "alert(‘登录失败!‘);", true);
                    }
                };
        }

        public IList<RoleInfo> RoleList
        {
            set
            {
                foreach (RoleInfo text in value)
                {
                    ListItem item = new ListItem();
                    item.Text = text.RoleName;
                    item.Value = text.RoleID;
                    ddlRole.Items.Add(item);
                }
            }
        }

    }

  最后说一点,这周公司内部培训,接触了下struts2的框架,相比之下,突然觉得MVP只是一个概念,实际上用的时候并没有真正用到任何所谓的框架,MVP夹在MVC和MVVM之间感觉定位也是有点尴尬,就我目前的理解来说,MVP是一种关注代码分离的设计思想,还是不如MVVM分离的干净。

时间: 2024-10-12 18:38:58

简单的MVP框架搭建的相关文章

简单的SSM框架搭建教程

简单的ssm框架的搭建和配置文件 ssm框架里边的配置: 1.src路径下直接存放数据库和log4j的properties文件 2.src路径下建个config包,分别放置ssm的xml文件 3.修改WEB-INF路径下的web.xml 4.注意放置配置文件的路径问题 1.src路径下的jdbc.propreties和log4j.properties log4j.properties log4j.properties里边的代码,例如: # Global logging configuration

android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android课程表控件效果源码 Dagger.Clean.MVP框架搭建,快速开发- Andorid 任意界面悬浮窗,实现悬浮窗如此简单 android模仿QQ登录后保存账号和密码效果源码 Android简洁清爽的Todo清单工具(MVP+okhttp3+retrofit+gson) Android优质博客 K

[angularjs] MVC + Web API + AngularJs 搭建简单的 CURD 框架

MVC + Web API + AngularJs 搭建简单的 CURD 框架 GitHub 地址:https://github.com/liqingwen2015/Wen.MvcSinglePage 布局页的引用 <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script src="~/Scripts/bootstrap.min.js"></script&g

.Net框架搭建之1、SQL Server EF MVC简单三层框架

.Net简单三层框架简介 简单三层框架,是.Net开发中最最基础的框架了,由 数据访问层.逻辑处理层.表示层组成.一般情况下,在项目中数据模型Model层也是单独一层,但是只是单纯的数据模型不算在业务层划分当中. 好了,框架搭建,如果不了解,可能会觉得难以下手,了解之后,自然知道怎么做,只是其中的步骤,比起单纯的功能开发,是要繁琐不少,下面我们来一步一步搭建属于自己的框架,这里只列出重要步骤,其他未提到的细节可自行摸索. 数据模型Model层创建 数据模型层,首先要创建数据库,再从数据库生成EF

SpringMVC笔记——SSM框架搭建简单实例

落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发的框架,对于新手来说也是比较容易学习入门的.虽说容易,但在框架搭建过程中仍然遇到了许多问题,因此用实例记录下来吧. 实例 第一步——导包 Spring框架包及其依赖包 MyBatis框架包及其依赖包 MyBatis-EhCache架包 C3P0架包 MySql数据库驱动包 项目架包如下: 项目结构如

struts2+hibernate+spring注解版框架搭建以及简单测试(方便脑补)

为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->Maven Project--->Next(之后界面如下所示:) --->Next(点击next之后出现如下界面:选择最后一个 maven-archetype-webapp,然后点击next) --->Next(点击next之后出现如下界面,然后选择好组织号,工程号,版本号即可),最后点击Fi

struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)

为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->Maven Project--->Next(之后界面如下所示:) --->Next(点击next之后出现如下界面:选择最后一个 maven-archetype-webapp,然后点击next) --->Next(点击next之后出现如下界面,然后选择好组织号,工程号,版本号即可),最后点击Fi

使用idea搭建一个简单的SSM框架:(3)配置spring+mybatis

在此之前请先查看: 使用idea搭建一个简单的SSM框架:(1)使用idea创建maven项目 使用idea搭建一个简单的SSM框架:(2)配置springMVC 1 配置spring和mybatis整合文件 spring和mybatis整合分为三个步骤:(1)配置数据库,(2)配置SqlSessionFactoryBean (来自mybatis-spring),(3)配置MapperScannerConfigurer,该配置就我们通过接口定义的方法,就是mybatis的xml对应的namesp

搭建一个超级简单的spring框架

1.准备环境 (1)下载JDK.myEclipse.Tomcat,之后配置好相关的参数 备注:在myEclipse上配置Tomcat: 启动Tomcat服务后,在浏览器输入localhost:8080运行成功即表示配置成功 (2)新建一个Web Project 配置到Tomcat上 再次启动Tomcat,输入地址后,如果能运行成功即表示新建成功 2.前期准备 (1)首先下载所需要的jar包 下载地址: spring-framework-4.0.4.RELEASE-dist:http://repo