1.你所知道的設(shè)計(jì)模式有哪些?
參考回答
- 創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
- 結(jié)構(gòu)型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
-
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、命令模式、備忘錄
模式、狀態(tài)模式、訪問者模式、中介者模式、解釋器模式。
2.談?wù)凪VC、MVP和MVVM,好在哪里,不好在哪里 ?
參考回答:
2.1.MVC:
- 視圖層(View) 對(duì)應(yīng)于xml布局文件和java代碼動(dòng)態(tài)view部分
- 控制層(Controller) MVC中Android的控制層是由Activity來(lái)承擔(dān)的,Activity本來(lái)主要是作為初始化頁(yè)面,展示數(shù)據(jù)的操作,但是因?yàn)閄ML視圖功能太弱,所以Activity既要負(fù)責(zé)視圖的顯示又要加入控制邏輯,承擔(dān)的功能過多。
- 模型層(Model) 針對(duì)業(yè)務(wù)模型,建立數(shù)據(jù)結(jié)構(gòu)和相關(guān)的類,它主要負(fù)責(zé)網(wǎng)絡(luò)請(qǐng)求,數(shù)據(jù)庫(kù)處理,I/O的操作。
總結(jié)
具有一定的分層,model徹底解耦,controller和view并沒有解耦層與層之間的交互盡量使用回調(diào)或者去使用消息機(jī)制去完成,盡量避免直接持有 controller和view在android中無(wú)法做到徹底分離,但在代碼邏輯層面一定要分清業(yè)務(wù)邏輯被放置在model層,能夠更好的復(fù)用和修改增加業(yè)務(wù)
2.2.MVP
通過引入接口BaseView,讓相應(yīng)的視圖組件如Activity,F(xiàn)ragment去實(shí)現(xiàn)BaseView,實(shí)現(xiàn)了視圖層的獨(dú)立,通過中間層Preseter實(shí)現(xiàn)了Model和View的完全解耦。MVP徹底解決了MVC中View和Controller傻傻分不清楚的問題,但是隨著業(yè)務(wù)邏輯的增加,一個(gè)頁(yè)面可能會(huì)非常復(fù)雜,UI的改變是非常多,會(huì)有非常多的case,這樣就會(huì)造成View的接口會(huì)很龐大
2.3.MVVM
MVP中我們說(shuō)過隨著業(yè)務(wù)邏輯的增加,UI的改變多的情況下,會(huì)有非常多的跟UI相關(guān)的case,這樣就會(huì)造成View的接口會(huì)很龐大。而MVVM就解決了這個(gè)問題,通過雙向綁定的機(jī)制,實(shí)現(xiàn)數(shù)據(jù)和UI內(nèi)容,只要想改其中一方,另一方都能夠及時(shí)更新的一種設(shè)計(jì)理念,這樣就省去了很多在View層中寫很多case的情況,只需要改變數(shù)據(jù)就行。
2.4.三者如何選擇?
- 如果項(xiàng)目簡(jiǎn)單,沒什么復(fù)雜性,未來(lái)改動(dòng)也不大的話,那就不要用設(shè)計(jì)模式或者架構(gòu)方法,只需要將每個(gè)模塊封裝好,方便調(diào)用即可,不要為了使用設(shè)計(jì)模式或架構(gòu)方法而使用。
- 對(duì)于偏向展示型的app,絕大多數(shù)業(yè)務(wù)邏輯都在后端,app主要功能就是展示數(shù)據(jù),交互等,建議使用mvvm。
- 對(duì)于工具類或者需要寫很多業(yè)務(wù)邏輯app,使用mvp或者mvvm都可。
3.封裝p層之后.如果p層數(shù)據(jù)過大,如何解決?
參考回答:
對(duì)于MVP模式來(lái)說(shuō),P層如果數(shù)據(jù)邏輯過于臃腫,建議引入RxJava或則Dagger,越是復(fù)雜的邏輯,越能體現(xiàn)RxJava的優(yōu)越性
4.是否能從Android中舉幾個(gè)例子說(shuō)說(shuō)用到了什么設(shè)計(jì)模式 ?
參考回答:
- AlertDialog、Notification源碼中使用了Builder(建造者)模式完成參數(shù)的初始化
- Okhttp內(nèi)部使用了責(zé)任鏈模式來(lái)完成每個(gè)Interceptor攔截器的調(diào)用
- RxJava的觀察者模式;單例模式;GridView的適配器模式;Intent的原型模式
- 日常開發(fā)的BaseActivity抽象工廠模式
5.裝飾模式和代理模式有哪些區(qū)別 ?
參考回答:
裝飾器模式與代理模式的區(qū)別就在于
- 兩者都是對(duì)類的方法進(jìn)行擴(kuò)展,但裝飾器模式強(qiáng)調(diào)的是增強(qiáng)自身,在被裝飾之后你能夠在被增強(qiáng)的類上使用增強(qiáng)后的功能。
- 而代理模式則強(qiáng)調(diào)要讓別人幫你去做一些本身與你業(yè)務(wù)沒有太多關(guān)系的職責(zé)(記錄日志、設(shè)置緩存)代理模式是為了實(shí)現(xiàn)對(duì)象的控制,因?yàn)楸淮淼膶?duì)象往往難以直接獲得或者是其內(nèi)部不想暴露出來(lái)。
6.實(shí)現(xiàn)單例模式有幾種方法 ?懶漢式中雙層鎖的目的是什么 ??jī)纱闻锌盏哪康挠质鞘裁??
參考回答:
- 單例模式實(shí)現(xiàn)方法有多種:餓漢,懶漢(線程安全,線程非安全),雙重檢查(DCL),內(nèi)部類,以及枚舉
- 所謂雙層檢驗(yàn)鎖(在加鎖前后對(duì)實(shí)例對(duì)象進(jìn)行兩次判空的檢驗(yàn)):加鎖是為了第一次對(duì)象實(shí)例化的線程同步,而鎖內(nèi)還要有第二層判空是因?yàn)榭赡軙?huì)有多個(gè)線程進(jìn)入第一層if判斷內(nèi)部,而在加鎖代碼塊外排隊(duì)等候,如果鎖內(nèi)不進(jìn)行第二次檢驗(yàn),仍然會(huì)出現(xiàn)實(shí)例化多個(gè)對(duì)象的> 需要更多Android、Java資料、面經(jīng)的小伙伴可以幫忙點(diǎn)贊+關(guān)注,點(diǎn)擊傳送門,即可免費(fèi)領(lǐng)取!
情況。
7.用到的一些開源框架,介紹一個(gè)看過源碼的,內(nèi)部實(shí)現(xiàn)過程。
參考回答:
面試??停篛khttp,Retrofit,Glide,RxJava,GreenDao,Dagger等
8.Fragment如果在Adapter中使用應(yīng)該如何解耦?
參考回答:
- 接口回調(diào)
- 廣播
題外話
我們見過很多技術(shù)leader在面試的時(shí)候,遇到處于迷茫期的大齡程序員,比面試官年齡都大。這些人有一些共同特征:可能工作了7、8年,還是每天重復(fù)給業(yè)務(wù)部門寫代碼,工作內(nèi)容的重復(fù)性比較高,沒有什么技術(shù)含量的工作。問到這些人的職業(yè)規(guī)劃時(shí),他們也沒有太多想法。
其實(shí)30歲到40歲是一個(gè)人職業(yè)發(fā)展的黃金階段,一定要在業(yè)務(wù)范圍內(nèi)的擴(kuò)張,技術(shù)廣度和深度提升上有自己的計(jì)劃,才有助于在職業(yè)發(fā)展上有持續(xù)的發(fā)展路徑,而不至于停滯不前。
不斷奔跑,你就知道學(xué)習(xí)的意義所在!
注意:我們之前因?yàn)榍镎惺占亩滓欢€互聯(lián)網(wǎng)公司Android面試真題(含BAT、小米、華為、美團(tuán)、滴滴)和我自己整理Android復(fù)習(xí)筆記(包含Android基礎(chǔ)知識(shí)點(diǎn)、Android擴(kuò)展知識(shí)點(diǎn)、Android源碼解析、設(shè)計(jì)模式匯總、Gradle知識(shí)點(diǎn)、常見算法題匯總。)
《Android學(xué)習(xí)筆記總結(jié)+移動(dòng)架構(gòu)視頻+大廠面試真題+項(xiàng)目實(shí)戰(zhàn)源碼》,點(diǎn)擊傳送門,即可免費(fèi)領(lǐng)??!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-843972.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-843972.html
《Android學(xué)習(xí)筆記總結(jié)+移動(dòng)架構(gòu)視頻+大廠面試真題+項(xiàng)目實(shí)戰(zhàn)源碼》,點(diǎn)擊傳送門,即可免費(fèi)領(lǐng)??!
到了這里,關(guān)于flutter掃描二維碼,全套學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!