MVP模式

随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。

在MVP模式里通常包含4个要素:

     (1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);

     (2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;

     (3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);

     (4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

(原文地址:http://blog.csdn.net/vector_yi/article/details/24719873)

在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它 的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的 职责不断增加,以致变得庞大臃肿。当我们将其中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity其实就是MVP模式中 View,它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由 Presenter处理).

     另外,回想一下你在开发Android应用时是如何对代码逻辑进行单元测试的?是否每次都要将应用部署到Android模拟器或真机上,然后通过模拟用 户操作进行测试?然而由于Android平台的特性,每次部署都耗费了大量的时间,这直接导致开发效率的降低。而在MVP模式中,处理复杂逻辑的 Presenter是通过interface与View(Activity)进行交互的,这说明了什么?说明我们可以通过自定义类实现这个 interface来模拟Activity的行为对Presenter进行单元测试,省去了大量的部署及测试的时间。

MVC模式与MVP模式都作为用来分离UI层与业务层的一种开发模式被应用了很多年。在我们选择一种开发模式时,首先需要了解一下这种模式的利弊:

     无论MVC或是MVP模式都不可避免地存在一个弊端:

          额外的代码复杂度及学习成本。

     这就导致了这两种开发模式也许并不是很小型应用。

     但比起他们的优点,这点弊端基本可以忽略了:

     (1)降低耦合度

     (2)模块职责划分明显

     (3)利于测试驱动开发

     (4)代码复用

     (5)隐藏数据

     (6)代码灵活性


     对于MVP与MVC这两种模式,它们之间也有很大的差异。有一些程序员选择不使用任何一种模式,有一部分原因也许就是不能区分这两种模式差异。以下是这两种模式之间最关键的差异:

     (参考文章:http://www.infragistics.com/community/blogs/todd_snyder/archive /2007/10/17/mvc-or-mvp-pattern-whats-the-difference.aspx)

     MVP模式:

  • View不直接与Model交互,而是通过与Presenter交互来与Model间接交互

  • Presenter与View的交互是通过接口来进行的,更有利于添加单元测试

  • 通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑     

     MVC模式:

  • View可以与Model直接交互

  • Controller是基于行为的,并且可以被多个View共享

  • 可以负责决定显示哪个View

package com.weijie.mvpdemo.bean;


public class User {


private String name;

private String password;

public User(String name,String password) {

this.name = name;

this.password = password;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}


import com.weijie.mvpdemo.bean.User;

public interface IUserModel {

void putUser(String name,String pwd);

User getUser(String name);

}


import java.util.HashMap;


import com.weijie.mvpdemo.bean.User;


public class UserModel implements IUserModel {


private HashMap<String, String> map;

public UserModel() {

map = new HashMap<String, String>();

}

@Override

public void putUser(String name,String pwd) {

map.put(name, pwd);

}

@Override

public User getUser(String name) {

return new User(name, map.get(name));

}

}


import com.weijie.mvpdemo.bean.User;

import com.weijie.mvpdemo.model.IUserModel;

import com.weijie.mvpdemo.model.UserModel;

import com.weijie.mvpdemo.view.IUserView;


public class UserPresenter {


private IUserView mUserView;  

    private IUserModel mUserModel;

    

    public UserPresenter(IUserView mUserView) {

    this.mUserView = mUserView;

    mUserModel = new UserModel();

    }

    public void putUser(String name,String pwd) {

    mUserModel.putUser(name, pwd);

    }

    

    public void getUser(String name) {

    User user = mUserModel.getUser(name);

    mUserView.showName(user.getName());

    mUserView.showPassword(user.getPassword());

    }

    

}

public interface IUserView {


void showName(String name);

void showPassword(String pwd);

String getName();

String getPassword();

}




import com.weijie.mvpdemo.presenter.UserPresenter;

import com.weijie.mvpdemo.view.IUserView;


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.EditText;


public class UserActivity extends Activity implements OnClickListener, IUserView {


private UserPresenter presenter;

private EditText name,pwd;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_user);

name = (EditText) findViewById(R.id.name);

pwd = (EditText) findViewById(R.id.pwd);

findViewById(R.id.putUser).setOnClickListener(this);

findViewById(R.id.getUser).setOnClickListener(this);

presenter = new UserPresenter(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.putUser:

presenter.putUser(getName(), getPassword());

break;

case R.id.getUser:

presenter.getUser(getName());

break;

}

}


@Override

public void showName(String name) {

this.name.setText(name);

}


@Override

public void showPassword(String pwd) {

this.pwd.setText(pwd);

}


@Override

public String getName() {

return name.getText().toString();

}


@Override

public String getPassword() {

return pwd.getText().toString();

}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值