Andoriアーキテクチャの高レベルのインタビューの質問-MVC、MVP、MVVM、コンポーネント化、モジュラー分析

MVC

1. AndroidのMVCとは何ですか?特徴?

  1. Model:ビジネスモデル用に確立されたデータ構造とクラス(ビューとは関係なく、ビジネスのみに関連する)
  2. ViewXML/JAVAまたはJS+HTMLページを表示します。Activity/Frgamentビューの機能も想定しています。
  3. ControllerAndroid通常、制御層はその中にありActivity、Fragmentます。
    本質はController操作Model層のデータであり、表示の数据ためにView層に戻されます。

2. Android MVCの欠点:

  1. ActivityMVC標準ではありませんController、両方のController義務にView責任があり、Activityコードが肥大化しすぎます。
  2. View层そして、Model层お互いに結合され耦合过重代码量过大開発し、維持することが難しいです。

MVP

3.AndroidのMVPモード

  1. MVP(Model-View-Presenter)
  2. Model:主にデータストレージ機能を提供します。データPresenterModelアクセスする必要があります。
  3. View:処理を担当します点击事件和视图展示Activity、Fragment或者某个View控件
  4. Presenter: データを取得した後、レイヤーに戻るView和Model間のブリッジそのため、結合関係はなくなります。ModelViewM/V

4. MVPとMVCの違いは何ですか?(2)

  1. MVPView直接アクセスは許可されませんModel
  2. 本質は增加了一个接口1つのレベル下げることです耦合度

5.MVPの機能

  1. Presenter完全ModelView分離されたメインロジックはPresenterにあります。
  2. Presenterそれは具体View互いに直接関連しておらず、明確に定義されたものを介して接口相互作用ます。
  3. View変更しても、変更しないでおくことができますPresenter(オブジェクト指向プログラミングの特性に沿って)
  4. View単純なSet/Getメソッド、ユーザー入力、インターフェイスに表示されるコンテンツのみが必要であり、それ以上のものはありません。
  5. 低耦合:モデルとビューの分離により、この機能が決まります。

6. MVPの利点は何ですか?

  1. 低結合:モデルレイヤーとビューレイヤーの変換は相互に影響しません。
  2. 再利用性:モデルレイヤーは複数のビューに使用できます。たとえば、ビデオデータを要求するには、複数のページでこの機能が必要になる場合がありますが、モデルレイヤーコードのコピーは1つだけで十分です。
  3. 方便测试ModelレイヤーとViewレイヤーを個別にテストできます。

7.MVPのデメリット

  1. MVPインタフェースは、接続に使用されるview层presenter层、非常に複雑なロジックを含むページがある場合、インターフェースを維持するための非常に高いコストをもたらす、多くのインターフェースが存在するであろう。
  2. 解决办法:可能な限り、いくつかの一般的なインターフェイスが基本クラスとして使用され、他のインターフェイスは継承されます。

8. MVPの実現?

モデルレイヤー

//Model层-数据的实体类:NetInfo.java
public class NetInfo {
    private int code;
    private String msg;
    public NetInfo(int code, String msg){
        this.code = code;
        this.msg = msg;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}
//Model层-请求数据时View和Model的交互接口(中间层Presenter去实现):LoadTasksCallBack.java
public interface LoadTasksCallBack<T> {
    void onSuccess(T data);
    void onFailed();
}
//Model层-任务抽象基类【业务接口】: NetTask.java
public interface NetTask<T> {
    void execute(T data, LoadTasksCallBack callBack);
}
/**=============================================
 * Model层核心-具体任务【业务的实际操作】:
 *   1. 实现Model层获取数据的操作.
 * //NetInfoTask.java
 *=============================================*/
public class NetInfoTask implements NetTask<String>{
    @Override
    public void execute(String ip, LoadTasksCallBack callBack) {
        if("192.168.1.1".equals(ip)){
            callBack.onSuccess(new NetInfo(1, "This is a Msg from " + ip));
        }else{
            callBack.onFailed();
        }
    }
}

プレゼンターレイヤー

 * 契约接口:
 *    存放相同业务的Preenter和View-便于查找和维护
 * //NetInfoContract.java
 *=============================================*/
public interface NetInfoContract{
    //1、Presenter定义了获取数据的方法
    interface Presenter{
        void getNetInfo(String ip);
    }
    //2、View中定义了与界面交互的方法
    interface View extends BaseView<Presenter> {
        void setNetInfo(NetInfo netInfo);
        void showError(String msg);
    }
}
/**=========================================
 * Presenter具体实现:NetInfoPresenter.info
 *   1. 分别与View层和Model层Task关联起来(持有了两者的对象)
 *   2. 实现接口getNetInfo()用于View层从Model层获取数据
 *   3. * 次要实现了Task执行中需要的回调接口-代理完成了View与Model的交互(避免了M/V的直接交互)
 *========================================*/
public class NetInfoPresenter implements NetInfoContract.Presenter, LoadTasksCallBack<NetInfo>{
    //1. View层
    private NetInfoContract.View mView;
    //2. Model层任务
    private NetTask mNetTask;
    //3. 分别与View和Model建立关联
    public NetInfoPresenter(NetInfoContract.View view, NetTask netTask){
        mNetTask = netTask;
        mView = view;
    }
    //4. 能让View层获取到Model层数据
    @Override
    public void getNetInfo(String ip) {
        mNetTask.execute(ip, this);
    }
    //5. 实现Model层需要的回调接口-作用是将Model层数据交给View层
    @Override
    public void onSuccess(NetInfo netInfo) {
        mView.setNetInfo(netInfo);
    }
    @Override
    public void onFailed() {
        mView.showError("error");
    }
}

レイヤーを表示

//BaseView.java
//View层的基类:定义了设置Presenter的接口
public interface BaseView<T> {
    void setPresenter(T presenter);
}
//HttpActivity.java
//  View层的具体实现:可以是Activity也可以是Fragment
public class HttpActivity extends Activity implements NetInfoContract.View{
    //1. 中间代理人
    private NetInfoContract.Presenter mPresenter;
    Button mGetButton, mSetButton;
    TextView mTitleTxtView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_activity_http);
        mGetButton = findViewById(R.id.get_fromnet_button);
        mSetButton = findViewById(R.id.set_button);
        mTitleTxtView = findViewById(R.id.title_textview);

        /**==============================================
         *  1、给View层设置Presenter和Model层的Task(获取数据)
         *===============================================*/
        setPresenter(new NetInfoPresenter(this, new NetInfoTask()));

        /**==============================================
         *  2、View层通过Presenter去获取数据
         *===============================================*/
        mGetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO 从网络请求到数据
                mPresenter.getNetInfo("192.168.1.1");
            }
        });
        mSetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTitleTxtView.setText("Local Msg = Hello");
            }
        });
    }

    /**=====================================
     * 3、实现View层的三个接口:设置Presenter和View界面相关功能
     *====================================*/
    @Override
    public void setPresenter(NetInfoContract.Presenter presenter) {
        mPresenter = presenter;
    }
    @Override
    public void setNetInfo(NetInfo netInfo) {
        mTitleTxtView.setText(netInfo.getMsg());
    }
    @Override
    public void showError(String msg) {
        mTitleTxtView.setText(msg);
    }
}

 

public interface LoginMVPContract{
    //View接口
    public interface ILoginView<T>{
        public void showLoginSuccess(T data);
        public void showLoginFailed(String errorMsg);
    }
    //任务接口
    public interface ILoginTask{
        public void startLogin(String phoneNumber, ILoginCallBack callback);
    }
    //Presenter
    public interface ILoginPresenter{
        public void startLogin(String phoneNumber);
    }
    //Presenter和Task间交互的接口
    public interface ILoginCallBack<T>{
        public void onLoginSuccess(T data);
        public void onLoginFailed(String errorMsg);
    }
}

2.モデルのLoginResultBeanおよびLoginTask.java

public class LoginResultBean {
}

public class LoginTask implements LoginMVPContract.ILoginTask{
    @Override
    public void startLogin(String phoneNumber, LoginMVPContract.ILoginCallBack callback) {
        if(true){
            callback.onLoginSuccess(new LoginResultBean());
        }else{
            callback.onLoginFailed("登录失败");
        }
    }
}

3、プレゼンター

public class LoginPresenter implements LoginMVPContract.ILoginPresenter, LoginMVPContract.ILoginCallBack{

    LoginMVPContract.ILoginView mLoginView;
    LoginMVPContract.ILoginTask mTask;

    public LoginPresenter(LoginMVPContract.ILoginView loginView, LoginMVPContract.ILoginTask task){
        mLoginView = loginView;
        mTask = task;
    }

    /**
     * 接口回调至
     */
    @Override
    public void onLoginSuccess(Object data) {
        mLoginView.showLoginSuccess(data);
    }

    @Override
    public void onLoginFailed(String errorMsg) {
        mLoginView.showLoginFailed(errorMsg);
    }

    @Override
    public void startLogin(String phoneNumber) {
        mTask.startLogin(phoneNumber, this);
    }
}

4、表示

public class LoginFragment extends SupportFragment implements LoginMVPContract.ILoginView<LoginResultBean>{

    LoginMVPContract.ILoginPresenter mLoginPresenter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLoginPresenter = new LoginPresenter(this, new LoginTask());
        mLoginPresenter.startLogin("17777777777");
    }

    @Override
    public void showLoginSuccess(LoginResultBean data) {
        //登陆成功
    }

    @Override
    public void showLoginFailed(String errorMsg) {
        //登录失败
    }
}

9.MVPファイルの量を最適化する方法

  1. 泛型model、view、presenter定義される定義コントラクトクラスを使用します契约类中
  2. 構造は明確で、1つは1つに契约类対応し业务模块ます。

MVVM

10. MVVMモデルの役割と特徴は?

  1. Model-View-ViewModel、にPresenter置き換えられViewModelます。
  2. ViewModelそしてModel/View、双方向バインディングを実行しました。
  3. View変更がある場合は、データの更新をViewModel通知Modelします
  4. Modelデータが更新されると、更新表示ViewModelが通知されますView
  5. GoogleがリリースしMVVMサポートライブラリをData Binding:にデータをバインドすることができますxml
  6. 現在、GoogleはViewModel和LiveDataより便利な実装のためのコンポーネントを導入していますMVVM

MVVM

モジュール化とコンポーネント化

11.モジュール性とは

  1. 一種软件设计技术
  2. 项目機能が分割され独立可交换モジュール
  3. それぞれ模块にの実行单独功能含まれてい必要内容ます。

12.コンポーネント化とは

  1. コンポーネントソフトウェアエンジニアリングは、コンポーネント開発とも呼ばれ、ソフトウェアエンジニアリングの一分野です。
  2. ソフトウェアシステムを独立したコンポーネントに分割することを強調します(コンポーネントはモジュールやWebリソースなどです)。

13.モジュール性とコンポーネント化の違い

  1. 両方の目的は重用和解耦
  2. 主に叫法不同
  3. 模块化再利用に焦点を当て、组件化さらに业务解耦

14.コンポーネント化の利点

  1. コンポーネント間の柔軟なアセンブリ
  2. 组件変更は、限り对外提供的接口変更はありません、ん其他组件テストする必要がありません。
  3. 短所:技術的およびビジネス的理解に対するより高い要件。

15.モジュラー階層分割

  1. 基本ライブラリ
  2. 一般的なビジネスレイヤー
  3. アプリケーション層

16.モジュール間の通信

  1. 自分で実装することもできますが、もっと面倒です
  2. 提案された阿里巴巴オープンソースライブラリ。

好きなものを読んだ後、習慣を身につけ、WeChatで「ProgrammingApe Development Center」検索して、乾物を書くのが好きなこのプログラマーをフォローしてください。

さらにAndroidのファーストラインインタビュー用の完全なテストサイトがあり、情報は私のGiteeで更新されます。インタビュー必要な友人それらを参照できます。それがあなたに役立つ場合は、スターを注文できます!

ギティーの住所:[オールドチェンのギティー]

おすすめ

転載: blog.csdn.net/qq_39477770/article/details/108868865
おすすめ