设计模式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; } }
}
}
四、运行结果
一、需求分析
选择省份,给出下辖的市;选择市,给出下辖的区县。
二、概要设计
首先,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; } }
}
}
四、运行结果
相关文章推荐
- 项目经验--orace 字段类型变更
- flume版本的选择
- MySQL监控
- git bisect快速定位版本的错误
- html--图片和文字一行时,中间上下对齐
- MySql中数据库存储过程与触发器案例
- GitHub上最火的Android开源项目整理
- STL 简单 queue 的实现
- 有关Android View 绘制流程 & 自定义View
- WorkTimer - Swift
- OpenCV实践之路——人脸识别之三识别自己的脸
- cplus学习
- Ubuntu make 降级方法
- GeekBand c++學習筆記之二(帶指針的class中的必須要學的-Big Three法則)
- git,github和sourcetree的简单使用
- [静态指针] 约瑟夫问题
- 计算机网络
- HDU 4717 三分
- 31. Next Permutation
- 根据节点解析xml