码迷,mamicode.com
首页 > 其他好文 > 详细

无聊学习一下MVP这个概念

时间:2019-11-21 22:37:25      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:window   ring   技术   event   subitems   src   box   空间   命名空间   

记录一下学习MVP,好处是便于替换前台页面(winfrom替换成asp.net),不改变页面逻辑层及其以后的层

M:业务逻辑

V:页面

P:页面逻辑 ,充当 页面和业务逻辑的中间层

规则:V和M不能直接接触,由P来做中间人

调用流程:V 去调用P,P去调用M,P调用M完成后,P调用V改变页面(这里为了保证P调用V不出错,使用了接口,规定V必须实现的方法)

 

建立四个库:

1 M :业务逻辑,可以用具体逻辑填充

2 V :页面,有自己的简单必要的代码逻辑,和调用P的代码 和 实现P规定的接口方法

3 P:页面逻辑,接到V的调用的代码,并调用M进行逻辑处理和调用V进行页面反馈

4 Models: 公用的实体类

技术图片

V的代码:

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

// 该命名空间下 存放页面类 
namespace V
{
    public partial class Form1 : Form, IPerson
    {
        private PersonLogic p;
        public Form1()
        {
            InitializeComponent();
            p = new PersonLogic(this);// 这行代码将MVP 中的V(页面)和P(页面逻辑)关联起来
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            p.ShowPersonListData();
        }

        private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            if (e.IsSelected)
            {
                p.SelectedIndex(e.Item.Text);
            }
        }


        #region P要回调的方法 接口的实现

        public void ShowMessage(string message)
        {
            MessageBox.Show(message);
        }

        public void ShowPersonList(List<PersonModel> list)
        {
            foreach (var item in list)
            {
                ListViewItem c = listView1.Items.Add(item.Name);
                c.SubItems.Add(item.Age.ToString());
            }
        }

        public void SelectName(string name, string age)
        {
            textBox1.Text = name;
            textBox2.Text = age;
        }

        #endregion
    }
}

 

P的接口代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models;


namespace P
{
    /// <summary>
    /// 规定页面中要实现的方法 会在页面逻辑类中调用
    /// </summary>
    public interface IPerson
    {
        void ShowMessage(string message);

        void ShowPersonList(List<PersonModel> list);

        void SelectName(string name, string age);

    }
}

P的页面逻辑代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using M;
using Models;

// 该命名空间下 存放 页面逻辑
namespace P
{
    public class PersonLogic
    {
        private IPerson view;
        PersonSevise sevice = new PersonSevise();
        public PersonLogic(IPerson iView)
        {
            view = iView;
        }

        public void ShowPersonListData()
        {
           view.ShowPersonList(sevice.list);
        }

        public void SelectedIndex(string name)
        {
           PersonModel model = sevice.list.Where(M => M.Name == name).FirstOrDefault();
           view.SelectName(model.Name, model.Age.ToString());
           view.ShowMessage("选中了");
        }
    }
}

M的逻辑代码 (数据处理,读写数据库):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models;

// 该命名空间下 存放业务逻辑类 实际中 就数据库和代码逻辑
namespace M
{
    public class PersonSevise
    {
        public List<PersonModel> list { get; set; }
        public PersonSevise()
        {
            list = new List<PersonModel>();
            list.Add(new PersonModel() { Name = "LXP1", Age = 18 });
            list.Add(new PersonModel() { Name = "LXP2", Age = 19 });
            list.Add(new PersonModel() { Name = "LXP3", Age = 20 });
            list.Add(new PersonModel() { Name = "LXP4", Age = 21 });
            list.Add(new PersonModel() { Name = "LXP5", Age = 22 });
            list.Add(new PersonModel() { Name = "LXP6", Age = 23 });
            list.Add(new PersonModel() { Name = "LXP7", Age = 24 });
            list.Add(new PersonModel() { Name = "LXP8", Age = 25 });
            list.Add(new PersonModel() { Name = "LXP9", Age = 26 });
            list.Add(new PersonModel() { Name = "LXP10", Age = 27 });
           
        }

        public void Add(PersonModel model)
        {
            list.Add(model);
        }
        public void Delete(PersonModel model)
        {
            list.Remove(list.Where(M => M.Equals(model)).FirstOrDefault());
        }
    }
}

Models实体类代码:

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

// 该命名空间下存放模型实体类
namespace Models
{
    public class PersonModel : IEquatable<PersonModel>
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public bool Equals(PersonModel other)
        {
            return this.Name == other.Name;
        }
    }
}

 

无聊学习一下MVP这个概念

标签:window   ring   技术   event   subitems   src   box   空间   命名空间   

原文地址:https://www.cnblogs.com/lixipeng/p/11908796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!