Model: 业务逻辑和实体模型
View:用户交互和视图显示,在android中对应activity
Presenter: 负责完成View于Model间的逻辑和交互
通常我们都用MVC。但是原有的MVC模式有一些短板。比如在android开发中,activity充当着MVC中Controller的角色,但是在实际开发中还需要处理view的逻辑(既担任V,又担任C)。当业务界面复杂时我的activity会显得很庞大。于是出现了MVP模式,它新增了一个Presenter角色用于处理数据和界面的模型以及逻辑,Activity仅仅用于展示界面和用户交互,这样就解决了MVC中角色不清的局面。 所以,MVP与MVC的重大区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部。
现在我们来做一个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();
}
}