ModeMVC:在activity中堆程式碼就叫做MVC嗎?
首先,看看這是不是自己
現在Android程式設計中如果在你沒有特別認真設計框架,沒有認真考慮面向物件的六大原則對程式設計重要性的時候,我們一般都是認為自己使用的是MVC的框架模式。但是你使用的真的是MVC嗎?還是隻是單純的在activity中堆程式碼?如果是後一種情況,那麼MVC框架的M,V,C這三層到底體現在哪呢?難道這三層都體現在了activity中嗎?如果是這樣,那麼我們也只是在單純的堆程式碼…
MVC發展史
典型的MVC
Model:
一般用來保持程式的資料狀態,如資料儲存、網路請求等。Model與View會存在一定的耦合,因為要通過 某種事件機制,比如觀察者模式,通知View以此來讓View更新;Model同時還會接收來自於Controller的事件;Model也會允許View查詢相關資料來改變自身狀態。
View:
View一般由GUI元件組成,響應使用者互動行為同時並觸發Controller的邏輯;View還會去修改Model的狀態來與Model保持同步,View還會在Model中註冊事件監聽其變化一次來重新整理自己展示給使用者,因此好的View設計應該是被動的,它只負責向用戶展示以及互動。
Controller
由View採集使用者的行為來觸發,並響應來自View的使用者互動,然後根據View的事件邏輯修改對應的Model,Controller並不關心View如何展示相關資料和狀態,而是通過修改Model並有Model的事件機制來觸發View的重新整理。
Web中的MVC
MVC的流行是在Web的時代,Web使用的是Request/Response的模型,沒有請求就不會有響應,在這種情況下無法實現典型MVC中Model主動通知View,然後退出了Model2,並在Web中大量應用
Model2中的Controller已經完全成為了中間人的角色,並且Model與View完全解耦,但是Model2這種模式是針對於Web這種Request/Response模式的,對於移動開發來說,Android和iOS都有一套完整的GUI框架,它提供了一套完整的控制元件系統,這些控制元件系統都有捕獲互動事件並處理事件的能力,這就讓Controller這個中間人的角色顯得多餘。
移動開發中的MVC
由於View與事件的關聯性太強,導致Model2中的Controller角色顯得多餘,所以在移動開發的MVC中將View和原本Controller負責使用者互動的部分打包成一個新的View,其他Controller負責的部分獨立為新的Controller,Model則不變。這樣MVC中的事件流就不再由Controller處理,而是由新包裝的View去處理,View截獲使用者的互動事件後將其傳遞給Controller,Controller根據事件作出響應決定是否需要改變Model,如果需要則對Model作出相應改變,Model發生改變後再將時間回傳給Controller,再由Controller將結果交給View展示給使用者
實現方式
Model
public class LoginModel implements LoginIModel {
private Context context;
private LoginListener loginListener;
public LoginModel(Context context , LoginListener loginListener) {
this.context = context;
this.loginListener = loginListener;
}
@Override
public void userLogin(String account, String password) {
if (TextUtils.isEmpty(account)){
Toast.makeText(context, "請輸入賬號...", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)){
Toast.makeText(context, "請輸入密碼...", Toast.LENGTH_SHORT).show();
return;
}
loginListener.onUserLoginSuccess();
}
public interface LoginListener{
void onUserLoginSuccess();
void onUserLoginError();
}
}
Controller
public class LoginActivity extends Activity implements View.OnClickListener, LoginModel.LoginListener {
private Button btn_login;
private EditText et_account , et_password;
private LoginModel model;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
model = new LoginModel(this , this);
initView();
}
private void initView() {
btn_login = findViewById(R.id.btn_login);
et_account = findViewById(R.id.et_account);
et_password = findViewById(R.id.et_password);
btn_login.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_login:
model.userLogin(et_account.getText().toString().trim() , et_password.getText().toString().trim());
break;
}
}
@Override
public void onUserLoginSuccess() {
btn_login.setVisibility(View.GONE);
}
@Override
public void onUserLoginError() {
}
}