[Android Nâng Cao] Mô hình MVP trong lập trình Android

hi các em, trong bài viết này anh giới thiệu tới các em mô hình MVP trong lập trình Android. Lưu ý : Các em nên đọc và tìm hiểu lại 1 chút khái niệm interface trong lập trình Java để có thể dễ dàng nắm bắt triển khai mô hình MVP

Bài viết về interface :

Lưu ý : Mô hình MVP có rất nhiều biến thể và linh hoạt trong từng tình huống sử dụng, trong bài viết này anh chỉ nêu 1 ví dụ đơn giản nhất để các em có thể tiếp cận và hiểu được mô hình này.

MVP là gì ?

Đầu tiên, có thể các bạn thắc mắc MVP là gì và nó ở đâu ra vậy, sao tự nhiên mọi người lại xài MVP.

MVP là “Design Pattern” . Design Pattern là 1 kiểu giải pháp, thiết kế cấu trúc trong lập trình phần mềm.
Như vậy tóm lại ta có MVP là 1 kiểu thiết kế cấu trúc trong lập trình phần mềm .
Và ngoài MVP chúng ta có thể biết tới nhiều kiểu thiết kế khác phổ biến trong lập trình phần mềm như MVC, gần đây với lập trình Android thì là MVPM (cái này anh sẽ giới thiệu ở bài kế tiếp nhé)

Tại sao dùng MVP

Trong mô hình MVP, các thành phần được chia làm 3 loại như bên dưới

Model : Cái này thì các bạn rất quen thuộc rồi, nó không có gì khác với cách làm hiện tại, dùng để mô tả, chứa dữ liệu . Ví dụ ta có model Student, Car, Bike …

View : là thành phần giao diện, tương tác với giao diện hoặc để người dùng tương tác thì đều là View

Presenter : là lớp trung gian giữa View và Model, mọi câu lệnh xử lý thông thường giữa View và Model như : hiển thị dữ liệu, xử lý logic chức năng đều được viết trong này.

1.1 Sơ đồ mô hình MVP

Cách thức triển khai MVP

Để triển khai mô hình MVP trong lập trình Android. Anh lấy ví dụ thường gặp đó là triển khai màn hình LoginActivity với 2 ô nhập liệu Username, Password và 1 nút Login với giao diện như sau :

Theo như sơ đồ 1.1 phía trên :

View : là 1 interface định nghĩa các phương thức thao tác tới giao diện là Activity LoginActivity

Model : Trong ví dụ này model là class User (chứa username và password cùng các hàm set, get thông thường)

Presenter : là class chứa các phương thức xử lý dữ liệu từ model và truyền vào View phía trên

Bước 1 : Tạo 1 interface tên là LoginView chứa các phương thức tác động tới giao diện

Tạo model User chứa 2 biến username và password

Tạo class LoginPresenter với hàm khởi tạo chứa tham số là LoginView

Tạo các phương thức xử lý dữ liệu trong class LoginPresenter , ở đây là sự kiện khi người dùng nhấn nút login

Cuối cùng, ta được class LoginActivity với nội dung như sau :

// implements interface LoginView và định nghĩa phần thân của các phương // thức
public class LoginActivity extends AppCompatActivity
        implements LoginView, View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loginPresenter = new LoginPresenter(this);
        initView();
        initAction();
    }

    private EditText edtUsername;
    private EditText edtPassword;
    private Button btnLogin;

    LoginPresenter loginPresenter;
 // tham chiếu các thành phần trên xml 
    public void initView() {
        edtUsername = findViewById(R.id.edtUsername);
        edtPassword = findViewById(R.id.edtPassword);
        btnLogin = findViewById(R.id.btnLogin);
    }
// set sự kiện click cho nút Login
    public void initAction() {
        btnLogin.setOnClickListener(this);
    }

    @Override
    public void loginSuccessful() {
        Toast.makeText(this, "Login Thanh Cong!!",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginFail() {
        Toast.makeText(this, "Login Fail!!",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void navigateHome() {
        startActivity(new Intent(this, MainActivity.class));
    }

    @Override
    public void setErrorUsername() {
        edtUsername.setError("Vui long nhap Username");
    }

    @Override
    public void setErrorPassword() {
        edtPassword.setError("Vui long nhap Password");
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btnLogin) {
            String username = edtUsername.getText().toString();
            String password = edtPassword.getText().toString();
            loginPresenter.login(username,password);
        }
    }
}

Code mẫu : https://github.com/huuhuybn/LoginMVP

Link tham khảo :

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter

https://medium.com/cr8resume/make-you-hand-dirty-with-mvp-model-view-presenter-eab5b5c16e42