您的位置:首页 > 移动开发 > Android开发

Android MVP 模式介绍与实战

2016-11-03 16:36 393 查看

1.什么是MVP?

Model: 业务逻辑和实体模型
View:用户交互和视图显示,在android中对应activity
Presenter: 负责完成View于Model间的逻辑和交互




2.为什么要用MVP?

通常我们都用MVC。但是原有的MVC模式有一些短板。比如在android开发中,activity充当着MVC中Controller的角色,但是在实际开发中还需要处理view的逻辑(既担任V,又担任C)。当业务界面复杂时我的activity会显得很庞大。于是出现了MVP模式,它新增了一个Presenter角色用于处理数据和界面的模型以及逻辑,Activity仅仅用于展示界面和用户交互,这样就解决了MVC中角色不清的局面。

所以,MVP与MVC的重大区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部。

3.实战演练

现在我们来做一个demo,功能很简单。点击button添加一个用户,点击listview删除一个用户。xml文件如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.mvpdemo.MainActivity" >

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />

<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>

</LinearLayout>


先看一下demo的结构:



整个项目一共有三个操作

1.添加(操作Model)
2.删除(操作Model)
3.显示(操作View。这一点不太容易想到,毕竟MVC里面activity同时担任V和C的角色,不容易看出来)


因此,整个demo的操作逻辑就很清晰了



MainActivity.java

public class MainActivity extends Activity implements MainViewOperation {
private Button button;
private ListView listView;
private ArrayAdapter<User> adapter;
private Presenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

button = (Button) findViewById(R.id.button1);
listView = (ListView) findViewById(R.id.listView1);

presenter = new Presenter(this);
adapter = new ArrayAdapter<User>(this,
android.R.layout.simple_list_item_1, presenter.getUserList());
listView.setAdapter(adapter);

button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
presenter.addUser(new User("aaa", new Random().nextInt(10) + 1));
}
});
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
presenter.removeUser(position);
}
});
}

//显示数据,由于是adapter,所以只需要notifyDataSetChanged就可以将数据变化显示出来
@Override
public void show() {
adapter.notifyDataSetChanged();
}
}


MainViewOperation.java(提供“显示数据”接口)

public interface MainViewOperation {
public void show();
}


User.java(model类)

public class User {
public String name;
public int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

}


UserOperation.java(实现“添加”“删除”)

public class UserOperation {
private ArrayList<User> userList = new ArrayList<User>();

public void addUser(User user) {
userList.add(user);
}

public void removeUser(int index) {
userList.remove(index);
}

public ArrayList<User> getUserList(){
return userList;
}
}


Presenter.java(M和V的交互)

public class Presenter {
private UserOperation userOperation;
private MainViewOperation mainViewOperation;

public Presenter(MainViewOperation mainView) {
this.mainViewOperation = mainView;
userOperation = new UserOperation();
}

public void addUser(User user){
userOperation.addUser(user);
mainViewOperation.show();
}

public void removeUser(int index){
userOperation.removeUser(index);
mainViewOperation.show();
}

public ArrayList<User> getUserList(){
return userOperation.getUserList();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: