欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java面試題沖刺第十五天--設計模式

 更新時間:2021年08月06日 15:40:55   作者:  
這篇文章主要為大家分享了最有價值的三道關于設計模式的面試題,涵蓋內容全面,包括數據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下

面試題1:面向對象程序設計(OOP)的六大原則分別有哪幾個

開閉原則(Open Close Principle)及“開放-封閉原則”單一職責原則(Single Responsibility Principle)里氏替換原則(Liskov Substitution Principle)依賴倒置原則(Dependence Inversion Principle)接口隔離原則(Interface Segregation Principle)最少知識原則(Law Of Demeter)

面向對象程序設計中,需要遵守的原則主要有6個,稱為六大原則。面向對象程序設計原則也是我們用于評價一個設計模式的重要指標之一。在設計模式中,很多設計模式都遵守了這些原則。

原則名稱 內容說明
開閉原則 對擴展開放,對修改關閉。
單一職責原則 即一個類只負責相應領域的職責,即不要存在多于一個導致類變更的原因。
里氏代換原則 子類型必須能夠替換它們的父類型。一個軟件實體如果使用的是一個父類,那么當把這個父類替換成繼承該父類的子類,程序的行為不會發(fā)生任何變化。軟件實體察覺不出父類對象和子類對象的區(qū)別。
依賴倒置原則 要依賴于抽象,不要依賴于具體??蛻舳艘蕾囉诔橄篑詈稀3橄蟛粦斠蕾囉诩毠?jié);細節(jié)應當依賴于抽象;要針對接口編程,不針對實現編程。
接口隔離原則 客戶端不應該依賴它不需要的接口。一個類對另一個類的依賴應該建立在最小的接口上。
最少知識原則 對象與對象之間應該使用盡可能少的方法來關聯,避免千絲萬縷的關系。

面試題2:你說一下什么是設計模式

設計模式(Design pattern) 是解決軟件開發(fā)某些特定問題而提出的一些解決方案也可以理解成解決問題的一些思路。通過設計模式可以幫助我們增強代碼的可重用性、可擴充性、 可維護性、靈活性。我們使用設計模式最終的目的是實現代碼的 高內聚 和低耦合。

追問1:那你怎么理解高內聚和低耦合?

耦合:

也稱塊間聯系。指軟件系統(tǒng)結構中各模塊間相互聯系緊密程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性則越差。

內聚:

故名思議,表示內部間聚集、關聯的程度,那么高內聚就是指要高度的聚集和關聯。內聚是從功能角度來度量模塊內的聯系,一個好的內聚模塊應當恰好做一件事。它描述的是模塊內的功能聯系。

高內聚低耦合,是軟件工程中的概念,是判斷軟件設計好壞的標準,主要用于程序的面向對象的設計,主要看類的內聚性是否高,耦合度是否低。目的是使程序模塊的可重用性、移植性大大增強。通常程序結構中各模塊的內聚程度越高,模塊間的耦合程度就越低。

面試題3:設計模式有哪幾種?

總體來說設計模式分為三大類:

  • 創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
  • 結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
  • 行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪問者模式、中介者模式、解釋器模式。

除了23種常見設計模式外,其實還有兩類:并發(fā)型模式和線程池模式。

模式類型 名稱 定義
創(chuàng)建型 工廠方法模式(Factory Pattern) 定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個類。工廠方法模式是一個類的實例化延遲到子類。
創(chuàng)建型 抽象工廠模式(Abstract Factory Pattern) 提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。
創(chuàng)建型 單例模式(Singleton Pattern) 確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例,這個類稱為單例類,它提供全局訪問的方法。
創(chuàng)建型 建造者模式(Builder Pattern) 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。
創(chuàng)建型 原型模式(Prototype Pattern) 用原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。
結構型 適配器模式(Adapter Pattern) 將一個接口轉換成客戶希望的另一個接口,使接口不兼容的那些類可以一起工作
結構型 橋接模式(Bridge Pattern) 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
結構型 組合模式(Composite Pattern) 組合多個對象形成樹形結構以表示具有“整體—部分”關系的層次結構。使得用戶對單個對象和組合對象的使用具有一致性。
結構型 裝飾器模式(Decorator Pattern) 動態(tài)地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現更為靈活。
結構型 外觀模式(Facade Pattern) 為子系統(tǒng)中的一組接口提供一個統(tǒng)一的入口。外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用
結構型 享元模式(Flyweight Pattern) 運用共享技術有效地支持大量細粒度對象的復用。
結構型 代理模式(Proxy Pattern) 為其他對象提供一種代理以控制對這個對象的訪問。
行為型 責任鏈模式(Chain of Responsibility Pattern) 使多個對象都有機會處理請求,從而避免請求發(fā)送者與接收者耦合在一起。將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。
行為型 命令模式(Command Pattern) 將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。
行為型 解釋器模式(Interpreter Pattern) 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
行為型 迭代器模式(Iterator Pattern) 提供一種方法來訪問聚合對象中的各個元素,而不用暴露這個對象的內部表示。
行為型 中介者模式(Mediator Pattern) 用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
行為型 備忘錄模式(Memento Pattern) 在不破壞封裝的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài),這樣可以在以后將對象恢復到原先保存的狀態(tài)。
行為型 觀察者模式(Observer Pattern) 定義對象間的一種一對多依賴關系,使得每當一個對象狀態(tài)發(fā)生改變時,其相關依賴對象皆得到通知并被自動更新。
行為型 狀態(tài)模式(State Pattern) 允許一個對象在其內部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類。
行為型 策略模式(Strategy Pattern) 定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化。
行為型 模板方法模式(Template Pattern) 定義一個操作中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
行為型模式 訪問者模式(Visitor Pattern) 表示一個作用于某對象結構中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

追問1:你比較熟悉哪種設計模式?說說原理。

面試者老王:我都略懂一些。

面試官:那你走吧,簡歷還你。

在這里插入圖片描述

面試者老王:???

面試者老王:那我比較了解工廠、單例、代理和適配器模式。

追問2:那你說說適配器模式的原理吧

二狗不知道在哪聽說華為手機就是牛,非要新買了一個華為手機,它高高興興的拿到新手機,想要插上耳機聽歌,但發(fā)現手機沒有通用的原型耳機孔,仔細看了說明書之后發(fā)現,華為手機是充電孔耳機孔在一起,在插耳機時需要一個耳機口轉接器,才能插耳機。我們用程序員的眼觀來看,這里相當于增加了一個轉接器類用于適配耳機,這就類似于設計模式 —— 適配器模式(Adapter)。

適配器模式包裝目標類即適配者(Adaptee)成適配器。適配器提供客戶端所需要的接口,把客戶端的請求轉化成對適配者的調用。也就是說,客戶端訪問適配器時,在適配器內部將調用適配者的方法。

在這里插入圖片描述

  • Client:客戶端,調用自己需要的接口
  • TargetTarget:定義客戶端需要的跟特定需求相關的接口
  • Apaptee:已存在接口,通常滿足功能需求但與特定需求接口不一致
  • Adapter:適配器,將Adaptee適配為Client需要的Target接口。

適配器模式的主要功能是進行轉換匹配,用來復用已有的功能。適配器模式將某個類的接口轉換成客戶端期望的另一個接口,目的是消除由于接口不匹配所造成的類的兼容性問題。主要分為三類:類適配器模式、對象適配器模式、接口適配器模式。

三種適配器模式有各自的應用場景:

  • 類的適配器模式:將一個類轉換成滿足另一個新接口的類,創(chuàng)建一個新類,繼承原有的類,實現新的接口即可。
  • 對象的適配器模式:將一個對象轉換成滿足另一個新接口的對象,可以創(chuàng)建一個Wrapper類,持有原類的一個實例,在Wrapper類的方法中,調用實例的方法即可。
  • 接口的適配器模式:當不希望實現一個接口中所有的方法時,可以創(chuàng)建一個抽象類Wrapper,實現所有方法,我們寫別的類的時候,繼承抽象類即可。

適配器模式的本質是:轉換匹配,復用功能。適配器模式中被適配的接口Adaptee與適配的接口Target沒有關系,他們中的方法可以相同,也可以完全不同,適配器模式的實現方式是通過組合對象的方式進行的,將功能委托給被適配的對象進行的。適配器模式調用的序列圖如下所示:

在這里插入圖片描述

適配器模式的實現有以下幾種:

  • 常見適配:適配器類會實現接口,在實現過程中調用待適配的類中的方法
  • 智能適配器:在適配器類中實現接口中定義的新方法,通常來說,適配器類中既可以通過借助繼承類中的方法實現高層功能,也可以實現接口中定義的新方法,進行功能擴展。
  • 缺省適配:即對接口的缺省實現,即接口適配器模式。

此外,在適配過程中,可能接口功能的實現需要多個待適配類中的方法交互才能滿足需求,即同時適配多個類。適配實現的復雜度取決于待適配類與接口的相似度,相似程度越高,適配類的實現難度越低。

在實際項目過程中,通常會存在兩個版本共存的情況,這就是需要使用到雙向適配器。

兩個版本的實現代碼:

public interface Targetable1 {
	public void produce1();
}
public class Target1 implements Targetable1 {
	@Override
	public void produce1() {
		System.out.println("Targetable1的produce1實現");
	}
}

public interface Targetable2 {
	public void produce2();
}
public class Target2 implements Targetable2 {
	@Override
	public void produce2() {
		System.out.println("Targetable2的produce2實現");
	}
}

適配器類的代碼如下:

public class Adapter implements Targetable1, Targetable2 {

    private Targetable1 target1;
    private Targetable2 target2;

    @Override
    public void produce1() {
        target1.produce1();
    }

    @Override
    public void produce2() {
        target2.produce2();
    }
}

實際上,在使用適配器過程中存在一個問題:被適配的對象不兼容Adapter適配器類,這使得適配器類的適用范圍受到限制。而雙向適配器則解決了這樣的問題,可以滿足不同客戶采用不同方式查看同一不同對象的需求。

適配器模式優(yōu)缺點

優(yōu)點:

  • 更好的復用性。適配器模式可復用已實現接口的兼容。
  • 更好的擴展性。實現適配器的過程中可以調用自己開發(fā)的功能,實現系統(tǒng)的擴展。

缺點:

過多使用適配器,系統(tǒng)會比較混亂,不易理解。

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Spring中的SpringData詳細說明

    Spring中的SpringData詳細說明

    這篇文章主要介紹了Spring中的SpringData詳細說明,Spring Data 是Spring 的一個子項目, 旨在統(tǒng)一和簡化對各類型持久化存儲, 而不拘泥于是關系型數據庫還是NoSQL 數據存儲,需要的朋友可以參考下
    2023-11-11
  • java計算值所占的百分比,結果為100%問題

    java計算值所占的百分比,結果為100%問題

    這篇文章主要介紹了java計算值所占的百分比,結果為100%問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot之Profile的兩種使用方式詳解

    SpringBoot之Profile的兩種使用方式詳解

    當在不同的環(huán)境下,想通過修改配置文件來連接不同的數據庫,比如在開發(fā)過程中啟動項目時,想連接開發(fā)環(huán)境對應的數據庫,可以在配置文件中指定environment=dev,其他環(huán)境類似,此時就需要用到Spring為我們提供的Profile功能,本文給大家介紹了SpringBoot之Profile的兩種使用方式
    2024-10-10
  • 高可用架構etcd選主故障主備秒級切換實現

    高可用架構etcd選主故障主備秒級切換實現

    這篇文章主要為大家介紹了高可用架構etcd選主故障主備秒級切換的實現,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-02-02
  • 分析JVM的組成結構

    分析JVM的組成結構

    JVM(虛擬機):指以軟件的方式模擬具有完整硬件系統(tǒng)功能、運行在一個完全隔離環(huán)境中的完整計算機系統(tǒng) ,是物理機的軟件實現。JVM和VMware,Virtual Box等虛擬機一樣,都是運行在操作系統(tǒng)之上的計算機系統(tǒng)
    2021-06-06
  • SpringBoot實現緩存預熱的幾種常用方案

    SpringBoot實現緩存預熱的幾種常用方案

    緩存預熱是指在 Spring Boot 項目啟動時,預先將數據加載到緩存系統(tǒng)(如 Redis)中的一種機制,本文給大家介紹了SpringBoot實現緩存預熱的幾種常用方案,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-02-02
  • springboot整合vue2-uploader實現文件分片上傳、秒傳、斷點續(xù)傳功能

    springboot整合vue2-uploader實現文件分片上傳、秒傳、斷點續(xù)傳功能

    對于大文件的處理,無論是用戶端還是服務端,如果一次性進行讀取發(fā)送、接收都是不可取,很容易導致內存問題,下面這篇文章主要給大家介紹了關于springboot整合vue2-uploader實現文件分片上傳、秒傳、斷點續(xù)傳功能的相關資料,需要的朋友可以參考下
    2023-06-06
  • 基于注解的springboot+mybatis的多數據源組件的實現代碼

    基于注解的springboot+mybatis的多數據源組件的實現代碼

    這篇文章主要介紹了基于注解的springboot+mybatis的多數據源組件的實現,會使用到多個數據源,文中通過代碼講解的非常詳細,需要的朋友可以參考下
    2021-04-04
  • sprng和struts有什么區(qū)別?

    sprng和struts有什么區(qū)別?

    Spring和Struts都是近年來比較流行的框架,Struts主要用于表示層,Spring用于業(yè)務層,以及Hiberate主要用于持久層,
    2015-06-06
  • 在Windows系統(tǒng)下安裝Thrift的方法與使用講解

    在Windows系統(tǒng)下安裝Thrift的方法與使用講解

    今天小編就為大家分享一篇關于在Windows系統(tǒng)下安裝Thrift的方法與使用講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論