今天講解的 MVC 和 MVP 是兩種常見的軟體設計架構。當你的程式碼過於龐大或過於複雜時,這些架構可以有效提升代碼的可維護性和模組化。透過將業務邏輯和視圖邏輯進行明確分離,這些架構能讓你的代碼變得更加清晰可讀,並在開發過程中保持高效、易於管理與擴展。
MVC架構
M: 負責處理資料邏輯的相關事情
V: 負責顯示介面的相關事情
C: M和V之間溝通的橋樑,可以直接和 M 以及 V 互動。
MVP架構
M: 負責處理資料邏輯的相關事情
V: 負責顯示介面的相關事情
P: 作為 V 和 M 之間的橋樑,以及邏輯判斷。
我這麼說明,有可能不好理解,我直接用範例說明給你們看:
範例
我們的MainActivity他是代表我們的V,當在V這邊輸入帳號密碼,點擊登入,就會抓取帳號密碼丟給P去做邏輯判斷
MainActivity.Java
public class MainActivity extends AppCompatActivity implements Contract.View {
private EditText account;
private EditText password;
private Button sent;
private Context context = this;
private Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
account = (EditText) findViewById(R.id.editTextTextPersonName);
password = (EditText) findViewById(R.id.editTextTextPassword);
sent = (Button) findViewById(R.id.button);
presenter = new Presenter(this);
sent.setOnClickListener(new View.OnClickListener() {
/*增加點擊事件*/
@Override
public void onClick(View view) {
presenter.getLoginData(account.getText().toString(),password.getText().toString());
/*當按下送出按鈕時,會抓取帳號和密碼丟給Presenter判斷*/
}
});
}
@Override
public void loginError(){
Toast.makeText(context,"帳密錯誤",Toast.LENGTH_SHORT).show();
}
/*當Presenter判斷帳號或密碼錯誤呼叫此處*/
@Override
public void showUserName(String userName){
Toast.makeText(context,"歡迎登入" + userName,Toast.LENGTH_SHORT).show();
}
/*當Presenter判斷帳號或密碼正確呼叫此處*/
}
當Presenter接收到V丟過來帳號密碼,進行判斷,判斷帳號密碼輸入正確會到M,先拿取資料後,在將全部資料再傳回給V,顯示歡迎登入,當判斷帳號密碼輸入不正確,就會直接回到V,顯示帳密錯誤。
Presenter.Java
public class Presenter implements Contract.presenter{
private Contract.View callback;
private String userName;
private Model model;
public Presenter(Contract.View view){
this.callback = view;
/*接收view丟過來資訊*/
model = new Model(this);
}
@Override
public void getLoginData(String password , String account){
if (account.equals("0000") && password.equals("1111")){
userName = model.getUserName();
callback.showUserName(userName);
}
else
callback.loginError();
}
}
當Presenter在判斷帳號密碼輸入正確後,會到Model抓取使用者資料,一起傳回給V顯示
public class Model implements Contract.model{
private Contract.presenter callback;
public Model(Contract.presenter presenter){
this.callback = presenter ;
}
@Override
public String getUserName(){
return "Lin"; //使用者資料
}
}
以上是我 MVP、MVC 架構的介紹
顯示成果
登入失敗畫面
登入成功畫面