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文件如下
<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>
先看一下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 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 userList = new ArrayList();
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();
}
}