1. 程式人生 > >ModeMVC:在activity中堆程式碼就叫做MVC嗎?

ModeMVC:在activity中堆程式碼就叫做MVC嗎?

首先,看看這是不是自己

Alt
現在Android程式設計中如果在你沒有特別認真設計框架,沒有認真考慮面向物件的六大原則對程式設計重要性的時候,我們一般都是認為自己使用的是MVC的框架模式。但是你使用的真的是MVC嗎?還是隻是單純的在activity中堆程式碼?如果是後一種情況,那麼MVC框架的M,V,C這三層到底體現在哪呢?難道這三層都體現在了activity中嗎?如果是這樣,那麼我們也只是在單純的堆程式碼…

MVC發展史

典型的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() {

    }
}