您的位置:首页 > 其它

设计模式MVP案例----省市查询

2016-05-21 21:21 288 查看
                                                 省市查询MVP

一、需求分析

选择省份,给出下辖的市;选择市,给出下辖的区县。

二、概要设计

首先,Model-view-presenter (MVP) 是使用者接口设计模式的一种,被广范用于便捷自动化单元测试和在呈现逻辑中改良分离关注点(separation
of concerns)。

·        Model 定义使用者接口所需要被显示的资料模型,一个模型包含着相关的商业逻辑。
·        View 视图为呈现使用者接口的终端,用以表现来自 Model 的资料,和使用者命令路由再经过 Presenter 对事件处理后的资料。
·        Presenter 包含着元件的事件处理,负责检索 Model 取得资料,和将取得的资料经过格式转换与 View 进行沟通。
在MVP模式中View并不直接使用Model,他们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部。
Presenter类图

 

 

三、主要代码

(1)    Presenter

 

using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Presenter
{
    public
interface IPresenter
    {
        void ShowProvinces();
        void ShowCities(int provinceId);
        void ShowDistricts(int cityId);
    }
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
using Domain;
usingSystem.ComponentModel.Composition;
usingSystem.ComponentModel.Composition.Hosting;
using IRepository;
 
namespace Presenter
{
    [Export(typeof(IPresenter))]
    public
class MyPresenter :
IPresenter
    {
        private
IView _view;
 
        [ImportingConstructor]
        public MyPresenter(IView view)
        {
            _view = view;
        }
 
        [Import]
        private
IData _data;
 
        public
void ShowCities(int provinceId)
        {
            _view.Cities = _data.Cities.Where(t=> t.ProvinceId == provinceId).OrderBy(t => t.CitySort).ToList();
        }
 
        public
void ShowDistricts(int cityId)
        {
            _view.Districts =_data.Districts.Where(t => t.CityId == cityId).OrderBy(t =>t.DisSort).ToList();
        }
 
        public
void ShowProvinces()
        {
            _view.Prvinces =_data.Provinces.OrderBy(t => t.ProSort).ToList();
        }
    }
}

(2)    UI

 

using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
using Domain;
using Presenter;
usingSystem.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
 
namespace QueryUI
{
    [Export(typeof(IView))]
    public
partial class
Form1 : Form,
IView
    {
        [Import]
        private
IPresenter _presenter;
 
        public Form1()
        {
            InitializeComponent();
            cmb_Province.DisplayMember =
"ProName";
            cmb_Province.ValueMember =
"ProId";
            cmb_City.DisplayMember =
"CityName";
            cmb_City.ValueMember =
"CityId";
            cmb_District.DisplayMember =
"DisName";
            cmb_District.ValueMember =
"DisId";
 
            //_presenter = new MyPresenter(this);
            MyComposePart();
        }
 
        //宿主MEF并组装部件
        internal
void MyComposePart()
        {
            //获取特定类型的Assemble
            var catelog =
new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);
            //初始化MEF容器
            var container =
new CompositionContainer(catelog);
            //向容器添加部件
            container.ComposeParts(this);
        }
 
      
b46b
  private
void Form1_Load(object sender,
EventArgs e)
        {
            _presenter.ShowProvinces();
        }
 
        private
void cmb_Province_SelectedIndexChanged(object sender,
EventArgs e)
        {
            var provinceId = (int)cmb_Province.SelectedValue;
            _presenter.ShowCities(provinceId);
        }
 
        private
void cmb_City_SelectedIndexChanged(object sender,
EventArgs e)
        {
            var cityId = (int)cmb_City.SelectedValue;
            _presenter.ShowDistricts(cityId);
        }
 
        private
void cmb_District_SelectedIndexChanged(object sender,
EventArgs e)
        {
 
        }
 
        public
IEnumerable<Province> Prvinces {
set{ cmb_Province.DataSource =
value; } }
 
        public
IEnumerable<City> Cities {
set { cmb_City.DataSource = value; } }
 
        public
IEnumerable<District> Districts {
set{ cmb_District.DataSource =
value; } }
 
 
    }
}
 

四、运行结果

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: