MVP模式的簡單介紹以及理解

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();
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章