MVP的意义
你是否遇到过这样的问题:在开发时发现按钮的button_onclick下的代码杂乱无章,而又没有其他的办法(在以前有人设计应用层来解决这个问题),你需要验证输入,需要获得控件的属性值等着一些列的操作使得表现层变得那么的臃肿,更不要说从winform移植到webfrom等不同的ui上面了。
怎么解决这个问题,以前在用vb开发时需要多个应用层,来解决这个问题,但是总感觉效果不是很好。那么怎么解决这个问题呢?我们来仔细看看表现层,发现表现层包括两个部分:user interface(UI)和presenter logic(P)。
MVP模型
也就是说我们UI应该仅仅局限于输入输出,至于展现逻辑其实我们平时没有将其和UI分离,因此造成了展现层的臃肿。那么MVP如何解决这个问题呢?我们先来看看MVP的模型结构图:
可以看出我们通过将表现层进行分离来解决我们上面的问题。View通过interface(是对view的抽象)和Presenter进行通信它只负责基本的输入输出 而Presenter负责界面逻辑 (如输入是否为空),这样一来不仅展现逻辑得到了分离而且它和view也进行了解耦使得view可以是任何类型的UI。
MVP的应用实例
说了那么多,到底该怎么去做呢?
我们来看一个具体的例子。假设我们现在在做一个winform的程序,需要做登录功能。现在我们已经布置好了界面,没有写任何的代码。
我们尽量的简化我们的应用,现在这个界面就是根据输入的用户名密码到数据库中比对如果用户名和密码都对就提示正确否则提示用户名或密码错误,当然在这里我们还要验证是否为空。
数据库部分我们只设置三个字段ID、UserName、UserPwd。
我们首先建立一个名为Presenter类库项目根据界面 抽象出一个接口ILoginView:我们可以看出接口应该把汗两个属性UserName、UserPwd,两个核心方法Login()、Exit(),当然为了使我们的接口更完整我们会有一个ShowMessage()的方法给出提示信息。
然后我们再建立一个名为LoginPresenter的类来处理页面逻辑,页面逻辑不复杂无非就是登录和退出。
但是这里它要利用Model中的服务,而且它是和具体的View无关的。
说了那么多还没有看到Model,建立一个名为Model的类库项目,比较简单,这里贴出代码.
User类:
UserAccess类:
IUserAccess
UserAccessFactory:
当然上面仅仅完成实体对象的转换以及基本元数据处理。下面肯定有业务逻辑吗,这才是Model的重要部分,不过对于我们的例子,就太简单了,看一下UserService:
以上是整个就是Model的代码,看起来有点多其实很简单,为了让大家更好的理解MVP我没有在这部分省略代码。
好了,Model固然重要但是接下来的就更重要了,因为我们的问题还没有解决。
我们建立一个winform应用程序有两个form一个是LoginView另一个是MainView,在LoginView中实现ILoginview接口执行相应的操作。
好了,到此为止我们的功能按照预期的实现了。代码很整洁,而且即便要修改成b/s结构我们也很容易,整个presenter都不用动。
注意我们是只写了一个view接口和一个presenter,那是因为我们只处理了一个窗口的业务,事实上是一个窗口对于一个view接口和一个presenter。
例子下载: