Mô Hình Mvp Là Gì

MVC, MVP, cùng MVVM là 3 mô hình thông dụng khi cải tiến và phát triển phần mềm. Trong nội dung bài viết này, mình sẽ reviews với chúng ta 3 mô hình mã sản phẩm View Controller (MVC), mã sản phẩm View Presenter (MVP) và mã sản phẩm View View-model (MVVM). Toàn bộ những quy mô trên hầu hết giúp đỡ bọn họ rất các trong việc cải tiến và phát triển một áp dụng dễ kết hợp, dễ kiểm thử với dễ duy trì. Bài viết này mình sẽ viết trong hoàn cảnh là căn nguyên Android.

Bạn đang xem: Mô hình mvp là gì

*

Model View Controller (MVC)

Mô hình MVC chia vận dụng ra thành 3 yếu tố chính: Model, View và Controller.

Model

Model nghĩa là những dữ liệu cần thiết để hiển thị sống View. Model đại diện cho một tập hợp những lớp diễn đạt business súc tích (business mã sản phẩm và data model). Nó cũng định nghĩa những business rules cho tài liệu (nghĩa là biện pháp mà dữ liệu đổi khác và được dùng)

View

View đại diện cho những thành phần UI như XML, HTML. View vẫn hiển thị tài liệu đã qua xử lý từ Controller. Model và View hệ trọng với nhau qua Observer pattern.

Controller

Controller có trọng trách xử lý các yêu mong (request) được giữ hộ đến. Nó đang xử lý các dữ liệu của người dùng qua model và trả về hiệu quả ở View

Ví dụ

Áp dụng quy mô MVC đến Tic Tac Toe game, ta bao gồm luồng hoạt động:

*

Code ví dụ:

public class TicTacToeActivity extends AppCompatActivity { private Board model; /* View Components referenced by the controller */ private ViewGroup buttonGrid; private View winnerPlayerViewGroup; private TextView winnerPlayerLabel; /** * In onCreate of the Activity we lookup và retain references to view components * và instantiate the model. */
Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.tictactoe); winnerPlayerLabel = (TextView) findViewById(R.id.winnerPlayerLabel); winnerPlayerViewGroup = findViewById(R.id.winnerPlayerViewGroup); buttonGrid = (ViewGroup) findViewById(R.id.buttonGrid); mã sản phẩm = new Board(); /** * Here we inflate và attach our reset button in the menu. */
Override public boolean onCreateOptionsMenu(Menu menu) MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_tictactoe, menu); return true; /** * We tie the reset() action to the reset tap event. */
Override public boolean onOptionsItemSelected(MenuItem item) switch (item.getItemId()) case R.id.action_reset: reset(); return true; default: return super.onOptionsItemSelected(item); /** * When the view tells us a cell is clicked in the tic tac toe board, * this method will fire. We update the mã sản phẩm and then interrogate it"s state * lớn decide how khổng lồ proceed. If X or O won with this move, update the view * to display this và otherwise mark the cell that was clicked. */ public void onCellClicked(View v) Button button = (Button) v; int row = Integer.valueOf(tag.substring(0,1)); int col = Integer.valueOf(tag.substring(1,2)); Player playerThatMoved = model.mark(row, col); if(playerThatMoved != null) button.setText(playerThatMoved.toString()); if (model.getWinner() != null) winnerPlayerLabel.setText(playerThatMoved.toString()); winnerPlayerViewGroup.setVisibility(View.VISIBLE); /** * On reset, we clear the winner label and hide it, then clear out each button. * We also tell the model to reset (restart) it"s state. */ private void reset() { winnerPlayerViewGroup.setVisibility(View.GONE); winnerPlayerLabel.setText(""); model.restart(); for( int i = 0; i

Đánh giá

MVC cực tốt trong vấn đề phân chia model và view. Chắc chắn sẽ dễ dãi test mã sản phẩm vì nó không liên quan đến view với view không tồn tại gì những để test (unit test). Tuy nhiên Controller vẫn còn đấy nhiều hạn chế.

Mặt hạn chế của ControllerKhả năng kiểm test (test) - Controller bị ràng buộc với android API phải sẽ khó để triển khai unit test.Tính linh hoạt - Controller tương quan khá nghiêm ngặt với những view. Nếu chúng ta biến hóa view bọn họ sẽ phải chuyển đổi lại sống controller.Khả năng duy trì - Qua thời gian, controller sẽ càng ngày càng phình lớn ra do câu hỏi thêm code dẫn tới việc khó kiểm soát.

Để xử lý vấn đễ này, họ dùng mô hình MVP!

Model View Presenter (MVP)

Mô hình MVP cũng gần giống với mô hình MVC. Nó được kế thừa từ mô hình MVC, trong những số ấy Controller được thay thế bới Presenter. Mô hình này chia ứng dụng thành 3 phần chính: Model, View cùng Presenter

Model

Model thay mặt cho một tập hợp những lớp biểu lộ business lô ghích (business mã sản phẩm and the data model). Nó cũng định nghĩa những business rules cho dữ liệu (nghĩa là cách mà dữ liệu biến đổi và được dùng)

View

View là thành phần địa chỉ trực tiếp với người tiêu dùng như XML, Activity, fragments. Nó không bao gồm bất kỳ câu hỏi xử lý súc tích nào.

Xem thêm: Mặt Nạ Phòng Độc Hàn Quốc Dm22, Mặt Nạ Phòng Độc Dobu

Presenter

Presenter đã nhận input đầu vào của người dùng thông qua View, rồi xử lý tài liệu của người dùng với sự hỗ trợ của model và trả kết quả về View. Presenter tiếp xúc với View qua interface. Interface được quan niệm trong lớp Presenter(với chiếc nó đề xuất truyền dữ liệu). Activity/fragment hoặc các view component không giống implement interface này cùng render dữ liệu.

Trong kết cấu MVP, presenter thao túng mã sản phẩm và cập nhật ở view. View với Presenter tách biệt cùng với nhau trọn vẹn và giao tiếp với nhau qua trải qua interface. Do nếu tách riêng từng phần sinh sống view sẽ dễ dãi cho việc kiểm thử ứng dụng ở MVP hơn so với quy mô MVC.

Ví dụ

Áp dụng mô hình MVP cho Tic Tac Toe game, ta gồm luồng hoạt động:

*

Code mẫu:

public class TicTacToePresenter implements Presenter private TicTacToeView view; private Board model; public TicTacToePresenter(TicTacToeView view) this.view = view; this.model = new Board(); // Here we implement delegate methods for the standard android Activity Lifecycle. // These methods are defined in the Presenter interface that we are implementing. Public void onCreate() model = new Board(); public void onPause() public void onResume() public void onDestroy() /** * When the user selects a cell, our presenter only hears about * what was (row, col) pressed, it"s up to lớn the view now khổng lồ determine that from * the Button that was pressed. */ public void onButtonSelected(int row, int col) Player playerThatMoved = model.mark(row, col); if(playerThatMoved != null) view.setButtonText(row, col, playerThatMoved.toString()); if (model.getWinner() != null) view.showWinner(playerThatMoved.toString()); /** * When we need to lớn reset, we just dictate what to lớn do. */ public void onResetSelected() view.clearWinnerDisplay(); view.clearButtons(); model.restart(); Để chuyển động mà không buộc phải viết activity vào presenter họ tạo interface nhằm activity implements nó.

public interface TicTacToeView void showWinner(String winningPlayerDisplayLabel); void clearWinnerDisplay(); void clearButtons(); void setButtonText(int row, int col, String text);

Đánh giá

MVP đang "clear" hơn so với MVC. Bạn có thể dễ dàng viết unit demo cho presenter vì nó không gắn thêm với bất cứ view cùng API làm sao của apk và nó cũng mang đến phép bọn họ làm việc với những view không giống miễn là view đó implement interface liên kết.

Mặt tinh giảm của PresenterKhả năng duy trì - cũng tương tự Controller, Presenter dễ ợt bị thêm những business xúc tích rải rác qua thời gian. Các developers sẽ tương đối khó để chia nhỏ dại presenter khi sẽ quá lớn.

Tất nhiên, một developer rất có thể ngăn ngừa vấn đề này nếu cẩn thận phòng tránh vụ việc này theo thời gian. Tuy nhiên, MVVM hoàn toàn có thể giúp giải quyết vấn đề này bằng cách làm ngăn nắp hơn!

Model View View-model (MVVM)

Mô hình MVVM cung cấp two-way data binding giữa View với View-Model. Điều này mang lại phép tự động lan truyền sự cố đổi, vào state của View-Model mang đến View. Tổng quan, View-Model sử dụng mô hình obsever để thông báo sự biến hóa trong View-Model đến Model.

View-Model

Nó có trách nhiệm trưng bày các phương thức, lệnh, và các properties khác giúp duy trì state của view, vận dụng mã sản phẩm như là hiệu quả của các hành vi ở view, và trigger những sự khiếu nại ở chính bản thân view. View tất cả reference mang lại View-Model cơ mà View-Model không có thông tin gì về View. Có quan hệ many-to-one thân View với View-Model nghĩa là các View có thể được bản đồ với một View-Model. View trọn vẹn độc lập.

Bi-directional data binding giỏi two-way data binding thân View và View-Model bảo đảm an toàn rằng những models và properties sinh hoạt View-Model được nhất quán với View. Quy mô MVVM sẽ phù hợp với những áp dụng cần được cung ứng bi-directional data binding.

Ví dụ

Áp dụng mô hình MVVM đến Tic Tac Toe game, ta tất cả luồng hoạt động:

*

Code mẫu:

public class TicTacToeViewModel implements ViewModel private Board model; /* * These are observable variables that the viewModel will update as appropriate * The view components are bound directly lớn these objects and react to lớn changes * immediately, without the ViewModel needing lớn tell it to vị so. They don"t * have khổng lồ be public, they could be private with a public getter method too. */ public final ObservableArrayMap cells = new ObservableArrayMap(); public final ObservableField winner = new ObservableField(); public TicTacToeViewModel() mã sản phẩm = new Board(); // As with presenter, we implement standard lifecycle methods from the view // in case we need to bởi vì anything with our mã sản phẩm during those events. Public void onCreate() public void onPause() public void onResume() public void onDestroy() /** * An Action, callable by the view. This kích hoạt will pass a message to the model * for the cell clicked and then update the observable fields with the current * mã sản phẩm state. */ public void onClickedCellAt(int row, int col) Player playerThatMoved = model.mark(row, col); cells.put("" + row + col, playerThatMoved == null ? null : playerThatMoved.toString()); winner.set(model.getWinner() == null ? null : model.getWinner().toString()); /** * An Action, callable by the view. This kích hoạt will pass a message to the model * lớn restart & then clear the observable data in this ViewModel. */ public void onResetSelected() model.restart(); winner.set(null); cells.clear(); Layouts: