溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

面試官:關(guān)于設(shè)計(jì)模式的這些問(wèn)題你來(lái)回答一下

發(fā)布時(shí)間:2020-07-08 13:37:47 來(lái)源:網(wǎng)絡(luò) 閱讀:137 作者:wx5d7cbef3496f3 欄目:編程語(yǔ)言

前言

前幾天小伙伴告訴我他面試的時(shí)候面試官問(wèn)到了設(shè)計(jì)模式相關(guān)的問(wèn)題,有幾道感覺(jué)答的不太好,可能拿不到offer了;

好在面試官仁慈,勉強(qiáng)拿到了offer,聽(tīng)說(shuō)是看在他的態(tài)度比較好,給他加了點(diǎn)分,但是設(shè)計(jì)模式掌握不太好的問(wèn)題還是存在的;小編也是把最新整理的設(shè)計(jì)模式的視頻給了他才解決的

小編把他被問(wèn)到的設(shè)計(jì)模式相關(guān)的問(wèn)題整理了一下,分享給大家,供大家參考

設(shè)計(jì)模式面試題

1. 請(qǐng)列舉出在 JDK 中幾個(gè)常用的設(shè)計(jì)模式?

單例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些類(lèi)中。工廠(chǎng)模式

(Factory pattern)被用于各種不可變的類(lèi)如 Boolean,像 Boolean.valueOf,觀(guān)察者模式

(Observer pattern)被用于 Swing 和很多的事件監(jiān)聽(tīng)中。裝飾器設(shè)計(jì)模式(Decorator

design pattern)被用于多個(gè) Java IO 類(lèi)中。

2. 什么是設(shè)計(jì)模式?你是否在你的代碼里面使用過(guò)任 何設(shè)計(jì)模式?

設(shè)計(jì)模式是世界上各種各樣程序員用來(lái)解決特定設(shè)計(jì)問(wèn)題的嘗試和測(cè)試的方法。設(shè)計(jì)模式

是代碼可用性的延伸

3.Java 中什么叫單例設(shè)計(jì)模式?請(qǐng)用 Java 寫(xiě)出線(xiàn)程安全的單例模式

單例模式重點(diǎn)在于在整個(gè)系統(tǒng)上共享一些創(chuàng)建時(shí)較耗資源的對(duì)象。整個(gè)應(yīng)用中只維護(hù)一個(gè)

特定類(lèi)實(shí)例,它被所有組件共同使用。Java.lang.Runtime 是單例模式的經(jīng)典例子。從 Java

5 開(kāi)始你可以使用枚舉(enum)來(lái)實(shí)現(xiàn)線(xiàn)程安全的單例。

4. 在 Java 中,什么叫觀(guān)察者設(shè)計(jì)模式(observer design pattern )?

觀(guān)察者模式是基于對(duì)象的狀態(tài)變化和觀(guān)察者的通訊,以便他們作出相應(yīng)的操作。簡(jiǎn)單的例

子就是一個(gè)天氣系統(tǒng),當(dāng)天氣變化時(shí)必須在展示給公眾的視圖中進(jìn)行反映。這個(gè)視圖對(duì)象

是一個(gè)主體,而不同的視圖是觀(guān)察者。

5. 使用工廠(chǎng)模式最主要的好處是什么?在哪里使用?

工廠(chǎng)模式的最大好處是增加了創(chuàng)建對(duì)象時(shí)的封裝層次。如果你使用工廠(chǎng)來(lái)創(chuàng)建對(duì)象,之后

你可以使用更高級(jí)和更高性能的實(shí)現(xiàn)來(lái)替換原始的產(chǎn)品實(shí)現(xiàn)或類(lèi),這不需要在調(diào)用層做任

何修改。

6. 舉一個(gè)用 Java 實(shí)現(xiàn)的裝飾模式(decorator design pattern) ?它是作用于對(duì)象層次還是類(lèi)

層次?

裝飾模式增加強(qiáng)了單個(gè)對(duì)象的能力。Java IO 到處都使用了裝飾模式,典型例子就是

Buffered 系列類(lèi)如 BufferedReader 和 BufferedWriter,它們?cè)鰪?qiáng)了 Reader 和 Writer 對(duì)象,

以實(shí)現(xiàn)提升性能的 Buffer 層次的讀取和寫(xiě)入。

7. 在 Java 中,為什么不允許從靜態(tài)方法中訪(fǎng)問(wèn)非靜態(tài)變量?

Java 中不能從靜態(tài)上下文訪(fǎng)問(wèn)非靜態(tài)數(shù)據(jù)只是因?yàn)榉庆o態(tài)變量是跟具體的對(duì)象實(shí)例關(guān)聯(lián)

的,而靜態(tài)的卻沒(méi)有和任何實(shí)例關(guān)聯(lián)。

8. 設(shè)計(jì)一個(gè) ATM 機(jī),請(qǐng)說(shuō)出你的設(shè)計(jì)思路?

比如設(shè)計(jì)金融系統(tǒng)來(lái)說(shuō),必須知道它們應(yīng)該在任何情況下都能夠正常工作。不管是斷電還

是其他情況,ATM 應(yīng)該保持正確的狀態(tài)(事務(wù)) , 想想 加鎖(locking)、事務(wù)

(transaction)、錯(cuò)誤條件(error condition)、邊界條件(boundary condition) 等等。盡管

你不能想到具體的設(shè)計(jì),但如果你可以指出非功能性需求,提出一些問(wèn)題,想到關(guān)于邊界

條件,這些都會(huì)是很好的。

9. 在 Java 中,什么時(shí)候用重載,什么時(shí)候用重寫(xiě)?

如果你看到一個(gè)類(lèi)的不同實(shí)現(xiàn)有著不同的方式來(lái)做同一件事,那么就應(yīng)該用重寫(xiě)

(overriding),而重載(overloading)是用不同的輸入做同一件事。在 Java 中,重載的方

法簽名不同,而重寫(xiě)并不是。

10. 舉例說(shuō)明什么情況下會(huì)更傾向于使用抽象類(lèi)而不是接口?

接口和抽象類(lèi)都遵循”面向接口而不是實(shí)現(xiàn)編碼”設(shè)計(jì)原則,它可以增加代碼的靈活性,

可以適應(yīng)不斷變化的需求。下面有幾個(gè)點(diǎn)可以幫助你回答這個(gè)問(wèn)題:

在 Java 中,你只能繼承一個(gè)類(lèi),但可以實(shí)現(xiàn)多個(gè)接口。所以一旦你繼承了一個(gè)類(lèi),你就

失去了繼承其他類(lèi)的機(jī)會(huì)了。

接口通常被用來(lái)表示附屬描述或行為如:Runnable、Clonable、Serializable 等等,因此當(dāng)你

使用抽象類(lèi)來(lái)表示行為時(shí),你的類(lèi)就不能同時(shí)是 Runnable 和 Clonable(注:這里的意思是指

如果把 Runnable 等實(shí)現(xiàn)為抽象類(lèi)的情況),因?yàn)樵?Java 中你不能繼承兩個(gè)類(lèi),但當(dāng)你使用

接口時(shí),你的類(lèi)就可以同時(shí)擁有多個(gè)不同的行為。

在一些對(duì)時(shí)間要求比較高的應(yīng)用中,傾向于使用抽象類(lèi),它會(huì)比接口稍快一點(diǎn)。

如果希望把一系列行為都規(guī)范在類(lèi)繼承層次內(nèi),并且可以更好地在同一個(gè)地方進(jìn)行編碼,

那么抽象類(lèi)是一個(gè)更好的選擇。有時(shí),接口和抽象類(lèi)可以一起使用,接口中定義函數(shù),而

在抽象類(lèi)中定義默認(rèn)的實(shí)現(xiàn)。

小編最新整理的設(shè)計(jì)模式視頻

面試官:關(guān)于設(shè)計(jì)模式的這些問(wèn)題你來(lái)回答一下


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI