Android面试题-架构MVC/MVP/MVVM

Android面试题,架构MVC/MVP/MVVM,包括MVC、MVP、MVVM的介绍和优缺点,以及组件化、模块化的概念问题。

本文是我一点点归纳总结的干货,但是难免有疏忽和遗漏,希望不吝赐教。
转载请注明链接:https://blog.csdn.net/feather_wch/article/details/81282033

有帮助的话请点个赞!万分感谢!

Android面试题-架构MVC/MVP/MVVM

版本:2018/8/16-1(10:31)

  • Android面试题-架构MVC/MVP/MVVM
    • MVC
    • MVP
    • MVVM
    • 模块化和组件化
    • 参考和学习资料

MVC

1、Android中MVC是什么?特点?

  1. Model:针对业务模型建立的数据结构和类(与View无关,只与业务相关)
  2. View:XML/JAVA或者JS+HTML进行页面的显示。Activity/Frgament也承担了View的功能。
  3. Controller:Android的控制层通常在Activity、Fragment之中。
    本质就是Controller操作Model层的数据,并且将数据返回给View层展示。

Android面试题-架构MVC/MVP/MVVM_第1张图片

2、Android的MVC的缺点:

  1. Activity并不是MVC中标准的Controller,既有Controller的职责也有View的职责,导致Activity的代码过于臃肿。
  2. View层Model层互相耦合,耦合过重,代码量过大,不易于开发和维护。

MVP

3、Android中的MVP模式

  1. MVP(Model-View-Presenter)
  2. Model:主要提供数据的存储功能。Presenter需要通过Model存取数据。
  3. View: 负责处理点击事件和视图展示(Activity、Fragment或者某个View控件)
  4. Presenter: View和Model之间的桥梁,从Model检索数据后返回给View层。使得M/V之间不再有耦合关系。

Android面试题-架构MVC/MVP/MVVM_第2张图片

4、MVP和MVC的区别?(2)

  1. MVP中绝对不允许View直接访问Model
  2. 本质是增加了一个接口降低一层耦合度

5、MVP的特点

  1. Presenter完全将ModelView解耦,主要逻辑处于Presenter中。
  2. Presenter具体View没有直接关联,通过定义好的接口进行交互。
  3. View变更时,可以保持Presenter不变(符合面向对象编程的特点)
  4. View只应该有简单的Set/Get方法、用户输入、界面展示的内容,此外没有更多内容。
  5. 低耦合:Model和View的解耦,决定了该特性。

6、MVP的优点?

  1. 低耦合:Model、View层的变换不会影响到对方。
  2. 可重用性:Model层可以用于多个View。比如请求影视数据,可能有多个页面都需要这个功能,但是Model层代码只要有一份就可以了。
  3. 方便测试:可以单独对Model层和View层进行测试。

7、MVP的缺点

  1. MVP的中使用了接口的方式去连接view层presenter层,如果有一个逻辑很复杂的页面,接口会有很多,导致维护接口的成本非常大。
  2. 解决办法:尽可能将一些通用的接口作为基类,其他的接口去继承。

8、MVP的实现?

请参考:https://blog.csdn.net/feather_wch/article/details/79729132
1、管理文件-LoginMVPContract.java

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、Model的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、Presenter

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、View

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. 结构清晰,一个契约类对应一个业务模块

MVVM

10、MVVM模式的作用和特点?

  1. Model-View-ViewModel,将Presenter替换为ViewModel
  2. ViewModelModel/View进行了双向绑定。
  3. View发生改变时,ViewModel会通知Model进行更新数据
  4. Model数据更新后,ViewModel会通知View更新显示
  5. 谷歌发布了MVVM支持库Data Binding:能将数据绑定到xml
  6. 现在谷歌又推出了ViewModel和LiveData组件用于更方便的实现MVVM

Android面试题-架构MVC/MVP/MVVM_第3张图片

模块化和组件化

11、什么是模块化

  1. 一种软件设计技术
  2. 项目的功能拆分为独立可交换的模块
  3. 每个模块都包含执行单独功能必要内容

12、什么是组件化

  1. 组件化软件工程也被成为组件化开发,是一种软件工程的分支。
  2. 强调将一个软件系统拆分为独立的组件(组件可以使模块也可以是web资源等等)

13、模块化和组件化的区别

  1. 两者目的都是重用和解耦
  2. 主要是叫法不同
  3. 模块化侧重于重用,组件化更侧重于业务解耦

14、组件化优点

  1. 组件间可以灵活组建
  2. 一个组件的更改,只要对外提供的接口没有变化,则其他组件不需要再测试。
  3. 缺点:对技术、业务理解度有更高要求。

15、模块化的层次拆分

  1. 基础库
  2. 通用业务层
  3. 应用层

16、模块间通信

  1. 可以自己实现但比较麻烦
  2. 建议用阿里巴巴的开源库。

参考和学习资料

  1. 认清Android框架 MVC,MVP和MVVM
  2. Data Binding
  3. 组件化开源方案-详细总结
  4. MVP\MVVM以及官方MVP样例工程

你可能感兴趣的:(Android,面试题)