吊打面試官之 設(shè)計(jì)模式

1. 介紹一下 如何實(shí)現(xiàn)動(dòng)態(tài)代理?
參考回答:

Java實(shí)現(xiàn)動(dòng)態(tài)代理的大致步驟如下:

1.定義一個(gè)委托類和公共接口。

2.自己定義一個(gè)類(調(diào)用處理器類,即實(shí)現(xiàn) InvocationHandler 接口),這個(gè)類的目的是指定運(yùn)行時(shí)將生成的代理類需要完成的具體任務(wù)(包括Preprocess和Postprocess),即代理類調(diào)用任何方法都會(huì)經(jīng)過(guò)這個(gè)調(diào)用處理器類(在本文最后一節(jié)對(duì)此進(jìn)行解釋)。

3.生成代理對(duì)象(當(dāng)然也會(huì)生成代理類),需要為他指定(1)委托對(duì)象(2)實(shí)現(xiàn)的一系列接口(3)調(diào)用處理器類的實(shí)例。因此可以看出一個(gè)代理對(duì)象對(duì)應(yīng)一個(gè)委托對(duì)象,對(duì)應(yīng)一個(gè)調(diào)用處理器實(shí)例。

4.Java 實(shí)現(xiàn)動(dòng)態(tài)代理主要涉及以下幾個(gè)類:

①java.lang.reflect.Proxy: 這是生成代理類的主類,通過(guò) Proxy 類生成的代理類都繼承了 Proxy 類,即 DynamicProxyClass extends Proxy。

②java.lang.reflect.InvocationHandler: 這里稱他為"調(diào)用處理器",他是一個(gè)接口,我們動(dòng)態(tài)生成的代理類需要完成的具體內(nèi)容需要自己定義一個(gè)類,而這個(gè)類必須實(shí)現(xiàn) InvocationHandler 接口。

2.談一談,java中有哪些代理模式?
參考回答:

靜態(tài)代理,動(dòng)態(tài)代理,Cglib代理。

3. Java IO都有哪些設(shè)計(jì)模式,簡(jiǎn)單介紹一下。
參考回答:

裝飾模式和適配器模式

推薦閱讀 從設(shè)計(jì)模式分析Java.IO https://juejin.im/post/5a2e4c49f265da430b7b3089
4.請(qǐng)你介紹一下單例模式?再說(shuō)一說(shuō) 懶漢式的單例模式如何實(shí)現(xiàn)單例?
參考回答:

定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。優(yōu)點(diǎn):?jiǎn)卫愔挥幸粋€(gè)實(shí)例、共享資源,全局使用節(jié)省創(chuàng)建時(shí)間,提高性能。可以用靜態(tài)內(nèi)部實(shí)現(xiàn),保證是懶加載就行了,就是使用才會(huì)創(chuàng)建實(shí)例對(duì)象。

5.請(qǐng)你介紹一下策略模式?
參考回答:

策略模式也叫政策模式,是一種行為型設(shè)計(jì)模式,是一種比較簡(jiǎn)單的設(shè)計(jì)模式。策略模式采用了面向?qū)ο蟮睦^承和多態(tài)機(jī)制。略模式適合使用在:1.多個(gè)類只有在算法或行為上稍有不同的場(chǎng)景。2.算法需要自由切換的場(chǎng)景。3.需要屏蔽算法規(guī)則的場(chǎng)景。 使用策略模式當(dāng)然也有需要注意的地方,那么就是策略類不要太多,如果一個(gè)策略家族的具體策略數(shù)量超過(guò)4個(gè),則需要考慮混合模式,解決策略類膨脹和對(duì)外暴露問(wèn)題。在實(shí)際項(xiàng)目中,我們一般通過(guò)工廠方法模式來(lái)實(shí)現(xiàn)策略類的聲明。


策略模式

優(yōu)點(diǎn):算法可以自由切換。2.避免使用多重條件判斷。3.擴(kuò)展性良好。

6. 對(duì)于設(shè)計(jì)模式,你了解哪些?請(qǐng)手寫一下觀察者模式。
參考回答:
設(shè)計(jì)模式

觀察者模式優(yōu)點(diǎn):

觀察者模式在被觀察者和觀察者之間建立一個(gè)抽象的耦合。被觀察者角色所知道的只是一個(gè)具體觀察者列表,每一個(gè)具體觀察者都符合一個(gè)抽象觀察者的接口。被觀察者并不認(rèn)識(shí)任何一個(gè)具體觀察者,它只知道它們都有一個(gè)共同的接口。由于被觀察者和觀察者沒(méi)有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那么這個(gè)對(duì)象必然跨越抽象化和具體化層次。

觀察者模式缺點(diǎn):

如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。

如果在被觀察者之間有循環(huán)依賴的話,被觀察者會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰。在使用觀察者模式是要特別注意這一點(diǎn)。

如果對(duì)觀察者的通知是通過(guò)另外的線程進(jìn)行異步投遞的話,系統(tǒng)必須保證投遞是以自恰的方式進(jìn)行的。

雖然觀察者模式可以隨時(shí)使觀察者知道所觀察的對(duì)象發(fā)生了變化,但是觀察者模式?jīng)]有相應(yīng)的機(jī)制使觀察者知道所觀察的對(duì)象是怎么發(fā)生變化的。

7.談一談,你了解的 Java設(shè)計(jì)模式。
參考回答:

所謂設(shè)計(jì)模式,就是一套被反復(fù)使用的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)(情境中一個(gè)問(wèn)題經(jīng)過(guò)證實(shí)的一個(gè)解決方案)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設(shè)計(jì)模式使人們可以更加簡(jiǎn)單方便的復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu)。將已證實(shí)的技術(shù)表述成設(shè)計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路。
在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中給出了三類(創(chuàng)建型[對(duì)類的實(shí)例化過(guò)程的抽象化]、結(jié)構(gòu)型[描述如何將類或?qū)ο蠼Y(jié)合在一起形成更大的結(jié)構(gòu)]、行為型[對(duì)在不同的對(duì)象之間劃分責(zé)任和算法的抽象化])共23種設(shè)計(jì)模式,包括:Abstract Factory(抽象工廠模式),Builder(建造者模式),F(xiàn)actory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式);Facade(門面模式),Adapter(適配器模式),Bridge(橋梁模式),Composite(合成模式),Decorator(裝飾模式),F(xiàn)lyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解釋器模式),Visitor(訪問(wèn)者模式),Iterator(迭代子模式),Mediator(調(diào)停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態(tài)模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(責(zé)任鏈模式)。

8.談一談,開(kāi)發(fā)中都用到了 哪些設(shè)計(jì)模式? 用在什么場(chǎng)合?
參考回答:

每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的解決方案的核心。通過(guò)這種方式,你可以無(wú)數(shù)次地使用那些已有的解決方案,無(wú)需在重復(fù)相同的工作。主要用到了MVC的設(shè)計(jì)模式。用來(lái)開(kāi)發(fā)JSP/Servlet或者J2EE的相關(guān)應(yīng)用。簡(jiǎn)單工廠模式等。

9. 談一談 J2EE 的常用 設(shè)計(jì)模式有哪些?再詳細(xì)說(shuō)說(shuō)工廠模式。
參考回答:

Java中的23種設(shè)計(jì)模式:
Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式),Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解釋器模式), Visitor(訪問(wèn)者模式),Iterator(迭代子模式), Mediator(調(diào)停者模式), Memento(備忘錄模式),Observer(觀察者模式), State(狀態(tài)模式), Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(責(zé)任鏈模式)工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實(shí)現(xiàn)的類可以根據(jù)提供的數(shù)據(jù)生成一組類中某一個(gè)類的實(shí)例,通常這一組類有一個(gè)公共的抽象父類并且實(shí)現(xiàn)了相同的方法,但是這些方法針對(duì)不同的數(shù)據(jù)進(jìn)行了不同的操作。首先需要定義一個(gè)基類,該類的子類通過(guò)不同的方法實(shí)現(xiàn)了基類中的方法。然后需要定義一個(gè)工廠類,工廠類可以根據(jù)條件生成不同的子類實(shí)例。當(dāng)?shù)玫阶宇惖膶?shí)例后,開(kāi)發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個(gè)子類的實(shí)例。

10.說(shuō)說(shuō)你所熟悉 或聽(tīng)說(shuō)過(guò)的,J2EE中的幾種常用模式。再講講你對(duì)設(shè)計(jì)模式的一些看法
參考回答:

Session Facade Pattern:使用SessionBean訪問(wèn)EntityBean Message Facade Pattern:實(shí)現(xiàn)異步調(diào)用EJB Command Pattern:使用Command JavaBeans取代SessionBean,實(shí)現(xiàn)輕量級(jí)訪問(wèn)Data Transfer Object Factory:通過(guò)DTO Factory簡(jiǎn)化EntityBean數(shù)據(jù)提供特性Generic Attribute Access:通過(guò)AttibuteAccess接口簡(jiǎn)化EntityBean數(shù)據(jù)提供特性Business Interface:通過(guò)遠(yuǎn)程(本地)接口和Bean類實(shí)現(xiàn)相同接口規(guī)范業(yè)務(wù)邏輯一致性EJB架構(gòu)的設(shè)計(jì)好壞將直接影響系統(tǒng)的性能、可擴(kuò)展性、可維護(hù)性、組件可重用性及開(kāi)發(fā)效率。項(xiàng)目越復(fù)雜,項(xiàng)目隊(duì)伍越龐大則越能體現(xiàn)良好設(shè)計(jì)的重要性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容