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

Java設(shè)計(jì)模式之GOF23全面講解

 更新時(shí)間:2021年07月29日 11:47:11   作者:哪 吒  
這篇文章主要介紹了Java設(shè)計(jì)模式之GOF23全面講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、什么是設(shè)計(jì)模式

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

二、設(shè)計(jì)模式的三大分類及關(guān)鍵點(diǎn)

1、創(chuàng)建型模式

對象實(shí)例化的模式,創(chuàng)建型模式用于解耦對象的實(shí)例化過程。

單例模式:某個(gè)類智能有一個(gè)實(shí)例,提供一個(gè)全局的訪問點(diǎn)。工廠模式:一個(gè)工廠類根據(jù)傳入的參量決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。抽象工廠模式:創(chuàng)建相關(guān)或依賴對象的家族,而無需明確指定具體類。建造者模式:封裝一個(gè)復(fù)雜對象的創(chuàng)建過程,并可以按步驟構(gòu)造。原型模式:通過復(fù)制現(xiàn)有的實(shí)例來創(chuàng)建新的實(shí)例。 2、結(jié)構(gòu)型模式

把類或?qū)ο蠼Y(jié)合在一起形成一個(gè)更大的結(jié)構(gòu)。

裝飾器模式:動態(tài)的給對象添加新的功能。代理模式:為其它對象提供一個(gè)代理以便控制這個(gè)對象的訪問。橋接模式:將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。適配器模式:將一個(gè)類的方法接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。組合模式:將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。外觀模式:對外提供一個(gè)統(tǒng)一的方法,來訪問子系統(tǒng)中的一群接口。享元模式:通過共享技術(shù)來有效的支持大量細(xì)粒度的對象。 3、行為型模式

類和對象如何交互,及劃分責(zé)任和算法。

策略模式:定義一系列算法,把他們封裝起來,并且使它們可以相互替換。模板模式:定義一個(gè)算法結(jié)構(gòu),而將一些步驟延遲到子類實(shí)現(xiàn)。命令模式:將命令請求封裝為一個(gè)對象,使得可以用不同的請求來進(jìn)行參數(shù)化。迭代器模式:一種遍歷訪問聚合對象中各個(gè)元素的方法,不暴露該對象的內(nèi)部結(jié)構(gòu)。觀察者模式:對象間的一對多的依賴關(guān)系。仲裁者模式:用一個(gè)中介對象來封裝一系列的對象交互。備忘錄模式:在不破壞封裝的前提下,保持對象的內(nèi)部狀態(tài)。解釋器模式:給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器。狀態(tài)模式:允許一個(gè)對象在其對象內(nèi)部狀態(tài)改變時(shí)改變它的行為。責(zé)任鏈模式:將請求的發(fā)送者和接收者解耦,使的多個(gè)對象都有處理這個(gè)請求的機(jī)會。訪問者模式:不改變數(shù)據(jù)結(jié)構(gòu)的前提下,增加作用于一組對象元素的新功能。

三、設(shè)計(jì)模式的幾種原則

1、單一職責(zé)原則

對于一個(gè)類,只有一個(gè)引起該類變化的原因;該類的職責(zé)是唯一的,且這個(gè)職責(zé)是唯一引起其他類變化的原因。

2、接口隔離原則

客戶端不應(yīng)該依賴它不需要的接口,一個(gè)類對另一個(gè)類的依賴應(yīng)該建立在最小的接口上。

3、依賴倒轉(zhuǎn)原則

依賴倒轉(zhuǎn)原則是程序要依賴于抽象接口,不要依賴于具體實(shí)現(xiàn)。簡單的說就是要求對抽象進(jìn)行編程,不要對實(shí)現(xiàn)進(jìn)行編程,這樣就降低了客戶與實(shí)現(xiàn)模塊間的耦合。

4、里式代換原則

任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。里氏代換原則是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換基類,軟件單位的功能不受影響時(shí),基類才能真正的被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。里氏代換原則是對開閉原則的補(bǔ)充。實(shí)現(xiàn)開閉原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。

5、開閉原則

(1)對于擴(kuò)展是開放的(Open for extension)。這意味著模塊的行為是可以擴(kuò)展的。當(dāng)應(yīng)用的需求改變時(shí),我們可以對模塊進(jìn)行擴(kuò)展,使其具有滿足那些改變的新行為。也就是說,我們可以改變模塊的功能。

(2)對于修改是關(guān)閉的(Closed for modification)。對模塊行為進(jìn)行擴(kuò)展時(shí),不必改動模塊的源代碼或者二進(jìn)制代碼。模塊的二進(jìn)制可執(zhí)行版本,無論是可鏈接的庫、DLL或者.EXE文件,都無需改動。

6、迪米特法則

迪米特法則又叫做最少知識原則,就是說一個(gè)對象應(yīng)當(dāng)對其它對象又盡可能少的了解,不和陌生人說話。

7、合成復(fù)用原則

合成復(fù)用原則要求在軟件復(fù)用時(shí),要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實(shí)現(xiàn),其次才考慮使用繼承關(guān)系來實(shí)現(xiàn)。如果要使用繼承關(guān)系,則必須嚴(yán)格遵循里氏替換原則。合成復(fù)用原則同里氏替換原則相輔相成的,兩者都是開閉原則的具體實(shí)現(xiàn)規(guī)范。

設(shè)計(jì)模式七大原則總結(jié)(超詳細(xì))

四、設(shè)計(jì)模式關(guān)系

五、設(shè)計(jì)模式感想

一共有23種設(shè)計(jì)模式,可以說都是為了提高代碼的可讀性、可擴(kuò)展性、可復(fù)用性、類的可替換性、組件化、可移植性等等特性。通過接口、抽象類、繼承、實(shí)現(xiàn)、委托、抽象、面向接口編程、多態(tài)、重載、重寫等方式使得代碼的這些特性得以彰顯,可以說只有深刻的理解了這些概念背后的哲學(xué)思想才能更好的理解設(shè)計(jì)模式。在設(shè)計(jì)模式中有很多思想,比如可以使用委托的不要使用繼承、開閉原則,面向擴(kuò)展開放,面向修改關(guān)閉,里式代換原則,父類一定能被子類代替并使用,反置則不然,面向接口編程,功能層次和實(shí)現(xiàn)層次分離(橋接模式)、高內(nèi)聚低耦合等思想,這些思想都是寶貴的,正是因?yàn)檫@樣的思想的存在才使得代碼的更新?lián)Q代的時(shí)候能夠盡可能少的甚至不用修改之前的代碼,直接加入新的內(nèi)容。提高軟件的開發(fā)周期,便于維護(hù)和升級,便于查找和糾錯(cuò),易于擴(kuò)展和使用。

同樣的設(shè)計(jì)模式主要分為三大類,創(chuàng)建型、行為型、結(jié)構(gòu)型。我們可以簡單的這樣分類,只不過這樣的分類似乎并不準(zhǔn)確,不能一語道出所有的本質(zhì),設(shè)計(jì)模式是相互關(guān)聯(lián)的,有的設(shè)計(jì)模式內(nèi)部其實(shí)是使用了別的設(shè)計(jì)模式作為支撐的,但是大體上這樣的一種劃分便于我們?nèi)ビ洃洠瑑H此而已。

六、設(shè)計(jì)模式回顧

從迭代器開始,我們將類中數(shù)據(jù)結(jié)構(gòu)的遍歷和類的功能實(shí)現(xiàn)分離出來,本質(zhì)上使用了工廠模式;

其次我們學(xué)習(xí)了適配器模式,它將不同的接口進(jìn)行適配,從而便于版本的兼容性以及其他功能;

然后我們學(xué)習(xí)了模板方法,使用模板面向抽象編程,便于新的子類的實(shí)現(xiàn)和管理;

之后學(xué)習(xí)了工廠模式,其實(shí)借用了模板模式來創(chuàng)建產(chǎn)品,是一種非常重要用處很廣的一種方法;

然后我們學(xué)習(xí)了單例模式,有懶漢式、餓漢式等,生成關(guān)于某個(gè)類全局唯一的對象,注意多線程的影響;

之后是原型模式,用來復(fù)制復(fù)雜的對象,使用了clone方法,然后是builder模式,用一個(gè)新的類對已有的抽象接口進(jìn)行整合和編程,從而構(gòu)建出我們想要的東西;

然后是抽象工廠模式,使用了工廠模式,組合模式等模式,面向抽象編程,將抽象零件組裝成抽象產(chǎn)品,便于具體工廠的創(chuàng)建,提高了代碼的組件化和復(fù)用性;

然后是橋接模式,將類的功能層次和實(shí)現(xiàn)層次分割開來,便于對應(yīng)的擴(kuò)展和使用;

然后是策略模式,可以整體的替換策略,使用也很廣泛;然后是組合模式,保證了同根同源,通過委托添加自己構(gòu)成遞歸,樹形結(jié)構(gòu),將具有樹形特點(diǎn)的對象組合起來;

然后是裝飾器模式,和組合模式的結(jié)構(gòu)類似,同樣是遞歸結(jié)構(gòu),從而可以不斷的裝飾,增加新的功能,很好用;

接著是visitor訪問者模式,通過在類外訪問類中的數(shù)據(jù)結(jié)構(gòu)從而得到想要的結(jié)果,便于程序的可擴(kuò)展性和組件化;

接著是責(zé)任鏈模式,推卸責(zé)任,根據(jù)問題的大小來考慮自己釋放處理,本質(zhì)是鏈表,便于職責(zé)分明;

然后是外觀模式,通過整合各個(gè)類之間的調(diào)用關(guān)系,組建成了統(tǒng)一的接口(API),便于外部類的調(diào)用;

接著是仲裁者模式,將很多類之間互相關(guān)聯(lián)的關(guān)系交給仲裁者處理,省去了各個(gè)類之間的嵌套和調(diào)動,有利于高內(nèi)聚和低耦合,思路清晰,便于擴(kuò)展;

然后是觀察者模式,通過互相委托從而能夠在被觀察的類發(fā)生改變的時(shí)候得到相應(yīng)的改變的信息并且處理;

然后是備忘錄模式,通過在某一時(shí)刻的狀態(tài)保存下來,便于恢復(fù),在游戲中使用的比較多;

然后是狀態(tài)模式,將狀態(tài)當(dāng)做類,從而職責(zé)分明,解除了很多繁瑣的if和else這些分支邏輯,便于擴(kuò)展;

然后是享元模式,輕量級對象,通過共用不變對象來實(shí)現(xiàn);

然后是代理模式,懶加載真正的服務(wù)器,加快訪問速度,代理是幫助服務(wù)器代理的;

然后是命令模式,將命令當(dāng)做類,通過保存一些列命令,從而能夠隨時(shí)執(zhí)行這些命令,需要清除命令的本質(zhì)就是一些操作和數(shù)據(jù);

最后是解釋器模式,利用編程原理的方法,來更高層次的封裝代碼,將自己開發(fā)的java代碼當(dāng)做編譯系統(tǒng),從而不用改變java代碼只修改更高語言層次的代碼就能實(shí)現(xiàn)不同的功能。 

到此這篇關(guān)于Java設(shè)計(jì)模式之GOF23全面講解的文章就介紹到這了,更多相關(guān)Java設(shè)計(jì)模式講解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java request.getHeader(

    java request.getHeader("user-agent")獲取瀏覽器信息的方法

    這篇文章主要介紹了java request.getHeader("user-agent")獲取瀏覽器信息的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 淺析Bean?Searcher?與?MyBatis?Plus?區(qū)別介紹

    淺析Bean?Searcher?與?MyBatis?Plus?區(qū)別介紹

    Bean?Searcher號稱任何復(fù)雜的查詢都可以一行代碼搞定,但?Mybatis?Plus?似乎也有類似的動態(tài)查詢功能,最近火起的?Bean?Searcher?與?MyBatis?Plus?倒底有啥區(qū)別?帶著這個(gè)問題一起通過本文學(xué)習(xí)下吧
    2022-05-05
  • Spring如何使用注解的方式創(chuàng)建bean

    Spring如何使用注解的方式創(chuàng)建bean

    這篇文章主要介紹了Spring如何使用注解的方式創(chuàng)建bean,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實(shí)現(xiàn)

    Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實(shí)現(xiàn)

    這篇文章主要給大家介紹了Java利用ITextPdf庫生成PDF預(yù)覽文件的具體實(shí)現(xiàn),文中通過代碼示例和圖文給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04
  • Java中的日期時(shí)間類實(shí)例詳解(Date、Calendar、DateFormat)

    Java中的日期時(shí)間類實(shí)例詳解(Date、Calendar、DateFormat)

    在JDK1.0中,Date類是唯一的一個(gè)代表時(shí)間的類,但是由于Date類不便于實(shí)現(xiàn)國際化,所以從JDK1.1版本開始,推薦使用Calendar類進(jìn)行時(shí)間和日期處理,這篇文章主要介紹了Java中的日期時(shí)間類詳解(Date、Calendar、DateFormat),需要的朋友可以參考下
    2023-11-11
  • springboot項(xiàng)目啟動,但是訪問報(bào)404錯(cuò)誤的問題

    springboot項(xiàng)目啟動,但是訪問報(bào)404錯(cuò)誤的問題

    這篇文章主要介紹了springboot項(xiàng)目啟動,但是訪問報(bào)404錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的圖文介紹

    IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的圖文介紹

    這篇文章主要介紹了IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的方法,包括配置方式及優(yōu)先級,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Java中HTTP GET方法調(diào)用帶有body的問題解決

    Java中HTTP GET方法調(diào)用帶有body的問題解決

    這篇文章主要為大家詳細(xì)介紹了Java如何解決HTTP GET方法調(diào)用帶有body的問題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-02-02
  • SparkSQL開窗函數(shù)分析使用示例

    SparkSQL開窗函數(shù)分析使用示例

    開窗函數(shù)的引入是為了既顯示聚集前的數(shù)據(jù),又顯示聚集后的數(shù)據(jù)。即在每一行的最后一列添加聚合函數(shù)的結(jié)果。開窗用于為行定義一個(gè)窗口,它對一組值進(jìn)行操作,不需要使用 GROUP BY 子句對數(shù)據(jù)進(jìn)行分組,能夠在同一行中同時(shí)返回基礎(chǔ)行的列和聚合列
    2023-01-01
  • Netty網(wǎng)絡(luò)編程實(shí)戰(zhàn)之開發(fā)聊天室功能

    Netty網(wǎng)絡(luò)編程實(shí)戰(zhàn)之開發(fā)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了如何利用Netty實(shí)現(xiàn)聊天室功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Netty網(wǎng)絡(luò)編程有一定幫助,需要的可以參考一下
    2022-10-10

最新評論