MVPモードを簡単に教えてあげます

5273 ワード

今日简単にMVPモードのdemoを书いて、MVCとMVPの区别はネット上でたくさんあって、ここでは多く言いません;
普段私达の开発はすべてMVCモードで、下で私达は1つのMVCの例を书いて、それからそれをMVPモードに変えて、対比してとてもはっきりしている间の区别;
需要:ページの上のButton、Buttonをクリックしてネットの要求を送信して、要求が成功した後の情報をToastで弾き出します;
この例はみんな書きます.コードは以下の通りです.
MVC例
public class MainActivity extends AppCompatActivity {
    private Button mBtnClick;
    private final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        onClickListener();
    }

    private void initView() {
        mBtnClick = findViewById(R.id.btn_click);
    }

    private void onClickListener() {
        mBtnClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getData();
            }
        });
    }

    private void getData() {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://wwww.baidu.com")
                .get()
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i(TAG+" onFailure",e.toString());
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_LONG).show();
                    }
                });
            }
        });
    }
}

MVCはすべてのビジネスロジックとデータ処理を一緒に書き、機能が多い場合は膨大で重いことを示します.
以下、上記の例をMVPモードに変換し、MVPを使うと必ずインターフェースを使い、比較的多くのインターフェースを書くのもMVPモードの欠点です.インタフェースクラスの作成を少なくするために、契約インタフェースを定義し、より緊密に結合し、以下のように簡単に表示できます.
public interface IMainContract {
    //View interface
    interface IMainView{
        void toast(String Content);
    }

    //Model interface
    interface IMainModel{
        void click(Callback callback);
    }

    //Presenter interface
    interface IMainPresenter{
        void handlerData();
    }
}

Viewレイヤ
ビジネスロジックはM層にあり、データの処理はP層にあるため、V層はデータを表示するだけでよい.V層はP層数処理データを通知し、P層処理後はV層に返信する
public class MainActivity extends AppCompatActivity implements IMainContract.IMainView {
    private Button mBtnClick;
    private PresenterManager mPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        mPresenter = new PresenterManager(this);
        onClickListener();
    }

    private void initView() {
        mBtnClick = findViewById(R.id.btn_click);
    }

    // 
    private void onClickListener(){
        mBtnClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPresenter.handlerData();// P 
            }
        });
    }

    @Override
    public void toast(final String Content) {// 
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, Content, Toast.LENGTH_LONG).show();
            }
        });
    }
}

Model層
ネットワーク要求データはこのレベルにあり、コードは以下の通りです.
public class ModelData implements IMainContract.IMainModel {

    @Override
    public void click(Callback callback) {// Callback, presenter 
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://wwww.baidu.com")
                .get()
                .build();
        Call call = client.newCall(request);
        call.enqueue(callback);
    }
}

プレゼンタ層
P層は、M層から取得したデータを処理してV層に伝え、V層はデータを表示する
public class PresenterManager implements IMainContract.IMainPresenter {
    private IMainContract.IMainModel model;
    private IMainContract.IMainView view;

    public PresenterManager(IMainContract.IMainView view) {// view model
        this.view = view;
        model = new ModelData();
    }

    @Override
    public void handlerData() {
        model.click(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (view != null)
                    view.toast(response.body().string());// V UI
            }
        });
    }
}

はい、これで書き終わります.細心の注意を払う人は、V層とM層の間に直接のつながりがなく、P層を通じて完成していることに気づきます.間違いありません.これがMVPモードの核心であり、V-Mを構造的に分離し、P層はV-M間のコミュニケーションの橋渡しであるため、P層にはV層オブジェクトとM層オブジェクトが含まれています.
まとめ:V層がデータを更新する場合、V層はP層に通知し、P層はM層に行ってデータを取得し、P層は取得したデータをV層に伝え、V層はさらに更新を実現する.
上記の例を見ると、MVCはMVPより簡単なのにコードが少なく、はっきり見えるという疑問があるかもしれません.実はこのようにして、上の例があまりにも簡単なため、MVPは一般的に多機能で、需要の大きいプロジェクトの中で最もその優位性を現すことができて、メンテナンスしやすくて、プロジェクトの構造の上でますますはっきりします.
MVCかMVPかは人それぞれでしょうが、