以下主要针对往期收录的面试题进行一个分类归纳整理,方便大家统一回顾和参考。本篇是第六集~
强调一下:因篇幅问题:文中只放部分内容,全部面试开发文档需要的可在公众号<Android苦做舟>获取。
第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)
第二篇面试题在这: Android中高级进阶开发面试题冲刺合集(二)
第三篇面试题在这: Android中高级进阶开发面试题冲刺合集(三)
第四篇面试题在这: Android中高级进阶开发面试题冲刺合集(四)
第五篇面试题在这: Android中高级进阶开发面试题冲刺合集(五)
设计模式
1.请简要谈一谈单例模式?
参考答案:
单例模式,主要用于某些环境下对象的唯一性,分为线程安全和不安全,写法也比较多,但是个人认为只要熟悉主要的几种就行,包括双检查、静态内部类、枚举
2.对于面向对象的六大基本原则了解多少?
参考答案:
- 单一职责(Single Responsibility Principle):一个类只做一件事,可读性提高
- 里式替换原则( Liskov Substitution Principle):依赖继承和多态,就是能用父类的地方就可以用子类替换,用子类的但不能用父类。
- 依赖倒置原则(Dependence Inversion Principle):依赖抽象,就是模块之间的依赖通过抽象发生。
- 开闭原则(Open-Close Principle):不管是实体类,模块还是函数都应该遵循对扩展开放对修改关闭。还是要依赖封装和继承
- 接口隔离原则(Interface Segregation Principle):一个类对另一个类的依赖应该建立在最小的接口上,如果接口太大,我们需要把它分割成一些更细小的接口,也是为了降低耦合性
- 迪米特原则(Law of Demeter ):也称最少知识原则,也就是说一个类应该对自己需要耦合或者调用的类知道的最少,只需知道该方法即可,实现细节不必知道。
3.请列出几种常见的工厂模式并说明它们的用法?
参考答案:
工厂模式
1.简单工厂(杂而不精)
一个工厂方法根据参数的不同创建不同的对象 (多重ifelse)
2.工厂方法(过于专一)
一个工厂负责生产一个具体对象(太多工厂类的使用)
3.抽象工厂(职责分离又不缺灵活)
通过参数选取不同的工厂生产对象
4.说说项目中用到的设计模式和使用场景?
参考答案:
单例模式
常见应用场景:网络请求的工具类、sp存储的工具类、弹窗的工具类等
工厂模式
常见应用场景:activity的基类等
责任链模式
常见应用场景:OKhttp的拦截器封装
观察者模式
常见应用场景:Rxjava的运用
代理模式
常见应用场景:AIDL的使用
建造者模式
常见应用场景:Dialog的创建
详细的说不出来,哈哈
感兴趣的可以看我的博客,最近有整理这一块,六大原则、23设计模式
5.什么是代理模式?如何使用?Android源码中的代理模式?
参考答案:
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。用图表示如下:
个人感觉和装饰者模式很类似。
其它问题可参考:https://www.jianshu.com/p/f82a03ec5110
6.谈一谈单例模式,建造者模式,工厂模式的使用场景?如何合理选择?
参考答案:
- 单例模式:保证全局只有一个实例,如网络请求
- 建造者模式:用于需要设置比较多的属性可以用直接链式,如AlerDialog
- 工厂模式:用于业务的实体类创建,易于扩展,如BitMapFactory
7.谈谈你对原型模式的理解?
参考答案:
1.定义
用原型对象的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.
2.使用场景
(1)类初始化需要消耗比较多的资源,通过原型拷贝可以避免这些消耗
(2)当new一个对象需要非常繁琐的数据准备等,这时可以使用原型模式
(3)当一个对象需要提供给其他调用者使用,并且各个调用者都可能修改其值时, 通过原型模式拷贝多个对象供调用者使用,保护性拷贝
Android 源码中例子:
Intent ,Intent的查找与匹配
原型模式实质上就是对象拷贝,要注意深拷贝和浅拷贝问题. 还有就是保护性拷贝,就是某个对象对外是只读的,为了防止外部对这个只读对象修改,通常可以通过返回一个对象的拷贝来实现只读的限制.
优点:
原型模式是在内存中的二进制流的拷贝,性能要比new一个对象好的多.减少了约束.
缺点:
直接在内存中拷贝,构造函数是不会执行的
8.请谈谈策略模式原理及其应用场景?
参考答案:
1.定义
定义了一系列算法,并将每一个算法封装起来,而且是它们之间可以相互替换. 策略模式让算法独立于使用它的客户而独立变化.
2.使用场景
(1)对同一类型问题的多种处理方式,仅仅是具体行为有差别时.
(2)需要安全封装多种同一类型的操作时.
(3)出现同一抽象类有多个子类, 而又需要使用if-else或者switch-case来选择具体子类时
Android 源码中例子:
时间插值器,加减速插值器, (内部封装了不同的算法,外部只需调用可实现不同的动态效果)
策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略
优点:
(1)结构清晰明了,使用简单直观
(2)耦合度相对而言比较低,扩展方便
(3)操作封装也更为彻底,数据更为安全
缺点:
(1)随着策略的增加,子类也会变得繁多
9.静态代理和动态代理的区别,什么场景使用?
参考答案:
静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理类:在程序运行时,运用反射机制动态创建而成。
静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。
动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。
还有一种动态代理CGLIB,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。通过在运行时,动态修改字节码达到修改类的目的。
10.谈一谈责任链模式的使用场景?
参考答案:
责任连模式定义: 将多个对象连成一条链,并沿着这条链传递该请求,只到有对象处理该请求为止。使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。
Android中责任链场景:
1) Android 源码中对于事件分发是基于该模式,Android 会将事件包装成一个事件对象从ViewTree的顶部至上而下的分发传递,只到有View处理该事件为止。
2)OkHttp 的拦截器也是基于责任链模式,用户请求和服务器返回数据,会经过内置拦截器链逐级的处理 。
计算机网络方面
1.请简述 Http 与 Https 的区别?
参考答案:
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是