java常見設(shè)計(jì)模式及實(shí)現(xiàn) 三種設(shè)計(jì)模式結(jié)合的Java程序
夕逆IT
- 前端設(shè)計(jì)
- 2023-08-13
- 82

大家好,今天給各位分享java常見設(shè)計(jì)模式及實(shí)現(xiàn)的一些知識,其中也會對三種設(shè)計(jì)模式結(jié)合的Java程序進(jìn)行解釋,文章篇幅可能偏長,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)...
大家好,今天給各位分享java常見設(shè)計(jì)模式及實(shí)現(xiàn)的一些知識,其中也會對三種設(shè)計(jì)模式結(jié)合的Java程序進(jìn)行解釋,文章篇幅可能偏長,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在就馬上開始吧!
Java中使用了設(shè)計(jì)模式思想的類有哪些
說起來設(shè)計(jì)模式,我們每個人都不陌生,多多少少聽過「設(shè)計(jì)模式」的大名。
工作中,我們也一直提及到Java設(shè)計(jì)模式,那么我們的JDK中又有哪些常見的設(shè)計(jì)模式呢?
今天我們就來一起說一說。
說起Java設(shè)計(jì)模式,通俗一點(diǎn)就是前人的經(jīng)驗(yàn)總結(jié),經(jīng)由不斷演進(jìn),形成了一套場景結(jié)構(gòu)設(shè)計(jì)的一套解決方案。
Java設(shè)計(jì)模式共有23中涉及模式,總體分為:創(chuàng)建型模式、結(jié)構(gòu)型模式、行為型模式三類。
創(chuàng)建型模式創(chuàng)建型模式的核心思想就是分裝隱藏創(chuàng)建對象的邏輯方式,不讓客戶端直接通過new創(chuàng)建新對象。該分類下包含:工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式共5種設(shè)計(jì)模式。
這里舉幾個例子:
工廠模式:java.util.Calendar#getInstance()
抽象工廠模式:DocumentBuilderFactory
單例模式:java.lang.Runtime#getRuntime()
建造者模式:StringBuilder
原型模式:Object.clone
結(jié)構(gòu)型模式結(jié)構(gòu)型模式注重類與對象之間的組合,用組合的方式來替代繼承。該分類下包含:適配器模式、橋接模式、過濾器模式、組合模式、裝飾器模式、外觀模式、享元模式、代理模式共8中涉及模式。
這里舉典型的例子:
代理模式-java.lang.reflect.Proxy
享元模式:java.lang.Byte#valueOf(byte)
行為型模式
行為型模式關(guān)注的是對象之間的通訊交互,共有12中設(shè)計(jì)模式,責(zé)任鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態(tài)模式、空對象模式、策略模式、模版方法模式、訪問者模式。
舉個栗子:
迭代器模式:java.util.Iterator
觀察者模式:java.util.Observer
有人說設(shè)計(jì)模式是為了彌補(bǔ)Java語言的缺陷,你覺得是這樣嗎
看你從哪個層面來看待設(shè)計(jì)模式!
語言層面如果你從語言層面來看設(shè)計(jì)模式,那么這個說法可以說是對的。有部分設(shè)計(jì)模式是彌補(bǔ)了Java語言上的不足,最明顯的就是單例模式。
在Java中本身沒有提供單例對象的創(chuàng)建,需要通過單例模式來實(shí)現(xiàn),什么餓漢式,懶漢式,多線程下還要關(guān)注DCL,volatile關(guān)鍵字等等,衍生了很多的面試題。
而在現(xiàn)代語言中,很多都提供了創(chuàng)建單例對象的語法,比如Scala,Kotlin的object關(guān)鍵字。
代碼設(shè)計(jì)層面如果從代碼設(shè)計(jì)層面來看,設(shè)計(jì)模式提供了一套可復(fù)用的代碼結(jié)構(gòu),來解決特定問題。比如,當(dāng)需要動態(tài)化某些可選部分時,可以使用策略模式。當(dāng)需要一組操作來順序操作某個對象時,可以使用職責(zé)鏈模式。
架構(gòu)層面從架構(gòu)層面來看,設(shè)計(jì)模式對組件關(guān)系進(jìn)行了解耦。
假設(shè)我們要實(shí)現(xiàn)一個文件服務(wù)器,有一個UploadService來進(jìn)行上傳操作,可以調(diào)用ConvertService對文件進(jìn)行轉(zhuǎn)換。UploadService屬于核心模塊「上傳模塊」,而ConvertService屬于非核心模塊「轉(zhuǎn)換模塊」。
如果UploadService直接去調(diào)用ConvertService來執(zhí)行轉(zhuǎn)換,那么核心模塊就依賴了非核心模塊。如下圖:
非核心模塊是相對不穩(wěn)定的,核心模塊是相對穩(wěn)定的。核心模塊依賴了非核心模塊會導(dǎo)致核心模塊也不穩(wěn)定。所以可以使用策略模式來解耦:
看箭頭的方向,現(xiàn)在轉(zhuǎn)換模塊依賴于上傳模塊,轉(zhuǎn)換模塊的變化不會影響上傳模塊。依賴方向改變了,這就是傳說中的「依賴倒置」!
java 23種設(shè)計(jì)模式,一般情況下,常用的有哪些啊
工廠模式,工廠方法模式,單例模式,外觀(Facade)模式,觀察者(Observer)模式,橋接(Bridge)模式都是比較常用的,不同的項(xiàng)目有不同的設(shè)計(jì)方向,可以參考的設(shè)計(jì)模式也不盡相同,沒有定數(shù),只是上面這幾個模式用的比較多一些。
JAVA為什么要學(xué)設(shè)計(jì)模式
設(shè)計(jì)模式可以理解為解決一些列問題的經(jīng)驗(yàn)套路,充分考慮了對應(yīng)場景的實(shí)現(xiàn)方式,擴(kuò)展性等,用好設(shè)計(jì)模式就像站在了巨人的肩膀上,而且不用你重復(fù)去創(chuàng)造,
spring框架涉及到的設(shè)計(jì)模式有哪些你如何評價(jià)
1.簡單工廠,比如說BeanFactory
2.單列模式,spring默認(rèn)創(chuàng)建的bean都是單列的
3.適配器模式,在springMVC中,SpringMVC中的適配器HandlerAdatper
4.代理模式,比如說AOP
5.模板模式,比如說jdbcTemplate,redisTemplate
這是個人在使用spring框架總結(jié)出來的設(shè)計(jì)模式,我覺得是有關(guān)于JAVA面向?qū)ο?大原則的問題
你們自己編寫的代碼中用到了多少設(shè)計(jì)模式
1、設(shè)計(jì)模式的六大原則
總原則:開閉原則(OpenClosePrinciple)
開閉原則就是說對擴(kuò)展開放,對修改關(guān)閉。在程序需要進(jìn)行拓展的時候,不能去修改原有的代碼,而是要擴(kuò)展原有代碼,實(shí)現(xiàn)一個熱插拔的效果。所以一句話概括就是:為了使程序的擴(kuò)展性好,易于維護(hù)和升級。想要達(dá)到這樣的效果,我們需要使用接口和抽象類等,后面的具體設(shè)計(jì)中我們會提到這點(diǎn)。
1)單一職責(zé)原則
不要存在多于一個導(dǎo)致類變更的原因,也就是說每個類應(yīng)該實(shí)現(xiàn)單一的職責(zé),如若不然,就應(yīng)該把類拆分。
2)里氏替換原則(LiskovSubstitutionPrinciple)
里氏代換原則(LiskovSubstitutionPrincipleLSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。里氏代換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。里氏代換原則是對“開-閉”原則的補(bǔ)充。實(shí)現(xiàn)“開-閉”原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。
3)依賴倒轉(zhuǎn)原則(DependenceInversionPrinciple)
這個是開閉原則的基礎(chǔ),具體內(nèi)容:面向接口編程,依賴于抽象而不依賴于具體。寫代碼時用到具體類時,不與具體類交互,而與具體類的上層接口交互。
4)接口隔離原則(InterfaceSegregationPrinciple)
這個原則的意思是:每個接口中不存在子類用不到卻必須實(shí)現(xiàn)的方法,如果不然,就要將接口拆分。使用多個隔離的接口,比使用單個接口(多個接口方法集合到一個的接口)要好。
5)迪米特法則(最少知道原則)(DemeterPrinciple)
就是說:一個類對自己依賴的類知道的越少越好。也就是說無論被依賴的類多么復(fù)雜,都應(yīng)該將邏輯封裝在方法的內(nèi)部,通過public方法提供給外部。這樣當(dāng)被依賴的類變化時,才能最小的影響該類。
最少知道原則的另一個表達(dá)方式是:只與直接的朋友通信。類之間只要有耦合關(guān)系,就叫朋友關(guān)系。耦合分為依賴、關(guān)聯(lián)、聚合、組合等。我們稱出現(xiàn)為成員變量、方法參數(shù)、方法返回值中的類為直接朋友。局部變量、臨時變量則不是直接的朋友。我們要求陌生的類不要作為局部變量出現(xiàn)在類中。
6)合成復(fù)用原則(CompositeReusePrinciple)
原則是盡量首先使用合成/聚合的方式,而不是使用繼承。
2、常用模式簡析1)單例模式
單例模式(SingletonPattern)是Java中最簡單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實(shí)例化該類的對象。
2)工廠模式
工廠模式(FactoryPattern)是Java中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象。
3)建造者模式(Builder)
建造者模式(BuilderPattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。一個Builder類會一步一步構(gòu)造最終的對象。該Builder類是獨(dú)立于其他對象的。
4)適配器模式
適配器模式(AdapterPattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個獨(dú)立接口的功能。
這種模式涉及到一個單一的類,該類負(fù)責(zé)加入獨(dú)立的或不兼容的接口功能。舉個真實(shí)的例子,讀卡器是作為內(nèi)存卡和筆記本之間的適配器。您將內(nèi)存卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取內(nèi)存卡。
我們通過下面的實(shí)例來演示適配器模式的使用。其中,音頻播放器設(shè)備只能播放mp3文件,通過使用一個更高級的音頻播放器來播放vlc和mp4文件。
5)裝飾器模式
裝飾器模式(DecoratorPattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個包裝。
這種模式創(chuàng)建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的實(shí)例來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
6)代理模式
在代理模式(ProxyPattern)中,一個類代表另一個類的功能。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,在代理模式中,我們創(chuàng)建具有現(xiàn)有對象的對象,以便向外界提供功能接口。
7)原型模式
原型模式(PrototypePattern)是用于創(chuàng)建重復(fù)的對象,同時又能保證性能。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
這種模式是實(shí)現(xiàn)了一個原型接口,該接口用于創(chuàng)建當(dāng)前對象的克隆。當(dāng)直接創(chuàng)建對象的代價(jià)比較大時,則采用這種模式。例如,一個對象需要在一個高代價(jià)的數(shù)據(jù)庫操作之后被創(chuàng)建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數(shù)據(jù)庫,以此來減少數(shù)據(jù)庫調(diào)用。
8)備忘錄模式
提供了一種可以恢復(fù)狀態(tài)的機(jī)制,實(shí)現(xiàn)了信息的封裝,使得用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié),不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣可以在以后將對象恢復(fù)到原先保存的狀態(tài)。
9)觀察者模式
當(dāng)對象間存在一對多關(guān)系時,則使用觀察者模式(ObserverPattern)。比如,當(dāng)一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬于行為型模式。
10)策略模式
在策略模式(StrategyPattern)中,一個類的行為或其算法可以在運(yùn)行時更改。這種類型的設(shè)計(jì)模式屬于行為型模式。在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的context對象。策略對象改變context對象的執(zhí)行算法。
3、總結(jié)設(shè)計(jì)模式(Designpattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的;設(shè)計(jì)模式使代碼編制真正工程化;設(shè)計(jì)模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣。關(guān)于java常見設(shè)計(jì)模式及實(shí)現(xiàn),三種設(shè)計(jì)模式結(jié)合的Java程序的介紹到此結(jié)束,希望對大家有所幫助。
本文鏈接:http://xinin56.com/qianduan/4151.html