java 设计模式_快速上手Java设计模式之简介
大家好,我是你們的導(dǎo)師,經(jīng)常看我朋友圈的同學(xué)應(yīng)該知道,我每天會在微信上給大家免費(fèi)提供以下服務(wù)!
1、長期為你提供最優(yōu)質(zhì)的學(xué)習(xí)資源!
2、給你解決技術(shù)問題!
3、每天在朋友圈里分享優(yōu)質(zhì)的技術(shù)文章!
4、每周1、3、5送紙質(zhì)書籍免費(fèi)送給大家,每年至少送書800本書!
5、為大家推薦靠譜的就業(yè)單位!
請注意!我上面說的5點(diǎn)全部都是免費(fèi)的!全網(wǎng)你應(yīng)該找不到第二家吧!
當(dāng)然,大家在我私人微信上問我問題,僅限回答web前端、java相關(guān)的。
---------------------------
好了,接下來開始今天的技術(shù)分享!上次老師跟大家分享了Spring Cloud?的知識,今天跟大家分享下Java設(shè)計(jì)模式之簡介的知識。
0?前言設(shè)計(jì)模式(Design Pattern)是前輩們對代碼開發(fā)經(jīng)驗(yàn)的總結(jié),是解決特定問題的一系列套路。它不是語法規(guī)定,而是一套用來提高代碼可復(fù)用性、可維護(hù)性、可讀性、穩(wěn)健性以及安全性的解決方案。
1995 年,GoF(Gang of Four,四人組/四人幫)合作出版了《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書,共收錄了 23 種設(shè)計(jì)模式,從此樹立了軟件設(shè)計(jì)模式領(lǐng)域的里程碑,人稱「GoF設(shè)計(jì)模式」。
這 23 種設(shè)計(jì)模式的本質(zhì)是面向?qū)ο笤O(shè)計(jì)原則的實(shí)際運(yùn)用,是對類的封裝性、繼承性和多態(tài)性,以及類的關(guān)聯(lián)關(guān)系和組合關(guān)系的充分理解。
當(dāng)然,軟件設(shè)計(jì)模式只是一個(gè)引導(dǎo),在實(shí)際的軟件開發(fā)中,必須根據(jù)具體的需求來選擇:
對于簡單的程序,可能寫一個(gè)簡單的算法要比引入某種設(shè)計(jì)模式更加容易;但是對于大型項(xiàng)目開發(fā)或者框架設(shè)計(jì),用設(shè)計(jì)模式來組織代碼顯然更好。
1?軟件設(shè)計(jì)模式的產(chǎn)生背景
“設(shè)計(jì)模式”這個(gè)術(shù)語最初并不是出現(xiàn)在軟件設(shè)計(jì)中,而是被用于建筑領(lǐng)域的設(shè)計(jì)中。
1977 年,美國著名建筑大師、加利福尼亞大學(xué)伯克利分校環(huán)境結(jié)構(gòu)中心主任克里斯托夫·亞歷山大(Christopher Alexander)在他的著作《建筑模式語言:城鎮(zhèn)、建筑、構(gòu)造(A Pattern Language: Towns Building Construction)中描述了一些常見的建筑設(shè)計(jì)問題,并提出了 253 種關(guān)于對城鎮(zhèn)、鄰里、住宅、花園和房間等進(jìn)行設(shè)計(jì)的基本模式。
1979 年他的另一部經(jīng)典著作《建筑的永恒之道》(The Timeless Way of Building)進(jìn)一步強(qiáng)化了設(shè)計(jì)模式的思想,為后來的建筑設(shè)計(jì)指明了方向。
1987 年,肯特·貝克(Kent Beck)和沃德·坎寧安(Ward Cunningham)首先將克里斯托夫·亞歷山大的模式思想應(yīng)用在 Smalltalk 中的圖形用戶接口的生成中,但沒有引起軟件界的關(guān)注。
直到 1990 年,軟件工程界才開始研討設(shè)計(jì)模式的話題,后來召開了多次關(guān)于設(shè)計(jì)模式的研討會。
1995 年,艾瑞克·伽馬(ErichGamma)、理査德·海爾姆(Richard Helm)、拉爾夫·約翰森(Ralph Johnson)、約翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》(Design Patterns: Elements of Reusable Object-Oriented Software)一書,在本教程中收錄了 23 個(gè)設(shè)計(jì)模式,這是設(shè)計(jì)模式領(lǐng)域里程碑的事件,導(dǎo)致了軟件設(shè)計(jì)模式的突破。這 4 位作者在軟件開發(fā)領(lǐng)域里也以他們的“四人組”(Gang of Four,GoF)匿名著稱。
直到今天,狹義的設(shè)計(jì)模式還是所介紹的 23 種經(jīng)典設(shè)計(jì)模式。
2?軟件設(shè)計(jì)模式的概念與意義
有關(guān)軟件設(shè)計(jì)模式的定義很多,有些從模式的特點(diǎn)來說明,有些從模式的作用來說明。給出的定義是大多數(shù)學(xué)者公認(rèn)的,從以下兩個(gè)方面來說明。
1. 軟件設(shè)計(jì)模式的概念
軟件設(shè)計(jì)模式(Software Design Pattern),又稱設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。它描述了在軟件設(shè)計(jì)過程中的一些不斷重復(fù)發(fā)生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),具有一定的普遍性,可以反復(fù)使用。其目的是為了提高代碼的可重用性、代碼的可讀性和代碼的可靠性。
2. 學(xué)習(xí)設(shè)計(jì)模式的意義
設(shè)計(jì)模式的本質(zhì)是面向?qū)ο笤O(shè)計(jì)原則的實(shí)際運(yùn)用,是對類的封裝性、繼承性和多態(tài)性以及類的關(guān)聯(lián)關(guān)系和組合關(guān)系的充分理解。正確使用設(shè)計(jì)模式具有以下優(yōu)點(diǎn)。
可以提高程序員的思維能力、編程能力和設(shè)計(jì)能力。
使程序設(shè)計(jì)更加標(biāo)準(zhǔn)化、代碼編制更加工程化,使軟件開發(fā)效率大大提高,從而縮短軟件的開發(fā)周期。
使設(shè)計(jì)的代碼可重用性高、可讀性強(qiáng)、可靠性高、靈活性好、可維護(hù)性強(qiáng)。
當(dāng)然,軟件設(shè)計(jì)模式只是一個(gè)引導(dǎo)。在具體的軟件幵發(fā)中,必須根據(jù)設(shè)計(jì)的應(yīng)用系統(tǒng)的特點(diǎn)和要求來恰當(dāng)選擇。對于簡單的程序開發(fā),苛能寫一個(gè)簡單的算法要比引入某種設(shè)計(jì)模式更加容易。但對大項(xiàng)目的開發(fā)或者框架設(shè)計(jì),用設(shè)計(jì)模式來組織代碼顯然更好。
3?軟件設(shè)計(jì)模式的基本要素
軟件設(shè)計(jì)模式使人們可以更加簡單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu),它通常包含以下幾個(gè)基本要素:模式名稱、別名、動(dòng)機(jī)、問題、解決方案、效果、結(jié)構(gòu)、模式角色、合作關(guān)系、實(shí)現(xiàn)方法、適用性、已知應(yīng)用、例程、模式擴(kuò)展和相關(guān)模式等,其中最關(guān)鍵的元素包括以下 4 個(gè)主要部分。
1. 模式名稱
每一個(gè)模式都有自己的名字,通常用一兩個(gè)詞來描述,可以根據(jù)模式的問題、特點(diǎn)、解決方案、功能和效果來命名。模式名稱(PatternName)有助于我們理解和記憶該模式,也方便我們來討論自己的設(shè)計(jì)。
2. 問題
問題(Problem)描述了該模式的應(yīng)用環(huán)境,即何時(shí)使用該模式。它解釋了設(shè)計(jì)問題和問題存在的前因后果,以及必須滿足的一系列先決條件。
3. 解決方案
模式問題的解決方案(Solution)包括設(shè)計(jì)的組成成分、它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。因?yàn)槟J骄拖褚粋€(gè)模板,可應(yīng)用于多種不同場合,所以解決方案并不描述一個(gè)特定而具體的設(shè)計(jì)或?qū)崿F(xiàn),而是提供設(shè)計(jì)問題的抽象描述和怎樣用一個(gè)具有一般意義的元素組合(類或?qū)ο蟮?組合)來解決這個(gè)問題。
4. 效果
描述了模式的應(yīng)用效果以及使用該模式應(yīng)該權(quán)衡的問題,即模式的優(yōu)缺點(diǎn)。主要是對時(shí)間和空間的衡量,以及該模式對系統(tǒng)的靈活性、擴(kuò)充性、可移植性的影響,也考慮其實(shí)現(xiàn)問題。顯式地列出這些效果(Consequence)對理解和評價(jià)這些模式有很大的幫助。
4?GoF 的 23 種設(shè)計(jì)模式的分類和功能
1. 根據(jù)目的來分
根據(jù)模式是用來完成什么工作來劃分,這種方式可分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式 3 種。
創(chuàng)建型模式:用于描述“怎樣創(chuàng)建對象”,它的主要特點(diǎn)是“將對象的創(chuàng)建與使用分離”。GoF 中提供了單例、原型、工廠方法、抽象工廠、建造者等 5 種創(chuàng)建型模式。
結(jié)構(gòu)型模式:用于描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu),GoF 中提供了代理、適配器、橋接、裝飾、外觀、享元、組合等 7 種結(jié)構(gòu)型模式。
行為型模式:用于描述類或?qū)ο笾g怎樣相互協(xié)作共同完成單個(gè)對象都無法單獨(dú)完成的任務(wù),以及怎樣分配職責(zé)。GoF 中提供了模板方法、策略、命令、職責(zé)鏈、狀態(tài)、觀察者、中介者、迭代器、訪問者、備忘錄、解釋器等 11 種行為型模式。
2. 根據(jù)作用范圍來分
根據(jù)模式是主要用于類上還是主要用于對象上來分,這種方式可分為類模式和對象模式兩種。
類模式:用于處理類與子類之間的關(guān)系,這些關(guān)系通過繼承來建立,是靜態(tài)的,在編譯時(shí)刻便確定下來了。GoF中的工廠方法、(類)適配器、模板方法、解釋器屬于該模式。
對象模式:用于處理對象之間的關(guān)系,這些關(guān)系可以通過組合或聚合來實(shí)現(xiàn),在運(yùn)行時(shí)刻是可以變化的,更具動(dòng)態(tài)性。GoF 中除了以上 4 種,其他的都是對象模式。
表 1 介紹了這 23 種設(shè)計(jì)模式的分類。
3. GoF的23種設(shè)計(jì)模式的功能
前面說明了 GoF 的 23 種設(shè)計(jì)模式的分類,現(xiàn)在對各個(gè)模式的功能進(jìn)行介紹。
單例(Singleton)模式:某個(gè)類只能生成一個(gè)實(shí)例,該類提供了一個(gè)全局訪問點(diǎn)供外部獲取該實(shí)例,其拓展是有限多例模式。
原型(Prototype)模式:將一個(gè)對象作為原型,通過對其進(jìn)行復(fù)制而克隆出多個(gè)和原型類似的新實(shí)例。
工廠方法(Factory Method)模式:定義一個(gè)用于創(chuàng)建產(chǎn)品的接口,由子類決定生產(chǎn)什么產(chǎn)品。
抽象工廠(AbstractFactory)模式:提供一個(gè)創(chuàng)建產(chǎn)品族的接口,其每個(gè)子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。
建造者(Builder)模式:將一個(gè)復(fù)雜對象分解成多個(gè)相對簡單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。
代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強(qiáng)或修改該對象的一些特性。
適配器(Adapter)模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。
裝飾(Decorator)模式:動(dòng)態(tài)的給對象增加一些職責(zé),即增加其額外的功能。
外觀(Facade)模式:為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,使這些子系統(tǒng)更加容易被訪問。
享元(Flyweight)模式:運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒度對象的復(fù)用。
組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶對單個(gè)對象和組合對象具有一致的訪問性。
模板方法(TemplateMethod)模式:定義一個(gè)操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。
策略(Strategy)模式:定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的改變不會影響使用算法的客戶。
命令(Command)模式:將一個(gè)請求封裝為一個(gè)對象,使發(fā)出請求的責(zé)任和執(zhí)行請求的責(zé)任分割開。
職責(zé)鏈(Chain of Responsibility)模式:把請求從鏈中的一個(gè)對象傳到下一個(gè)對象,直到請求被響應(yīng)為止。通過這種方式去除對象之間的耦合。
狀態(tài)(State)模式:允許一個(gè)對象在其內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為能力。
觀察者(Observer)模式:多個(gè)對象間存在一對多關(guān)系,當(dāng)一個(gè)對象發(fā)生改變時(shí),把這種改變通知給其他多個(gè)對象,從而影響其他對象的行為。
中介者(Mediator)模式:定義一個(gè)中介對象來簡化原有對象之間的交互關(guān)系,降低系統(tǒng)中對象間的耦合度,使原有對象之間不必相互了解。
迭代器(Iterator)模式:提供一種方法來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。
訪問者(Visitor)模式:在不改變集合元素的前提下,為一個(gè)集合中的每個(gè)元素提供多種訪問方式,即每個(gè)元素有多個(gè)訪問者對象訪問。
備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取并保存一個(gè)對象的內(nèi)部狀態(tài),以便以后恢復(fù)它。
解釋器(Interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即解釋器。
今天就分享這么多,關(guān)于Java設(shè)計(jì)模式簡介,你學(xué)會了多少?歡迎在留言區(qū)評論,對于有價(jià)值的留言,我們都會一一回復(fù)的。如果覺得文章對你有一丟丟幫助,請點(diǎn)右下角【在看】,讓更多人看到該文章。
全網(wǎng)應(yīng)該只有我能做到了吧!有技術(shù)問題可以在微信上問我!(如下圖)總結(jié)
以上是生活随笔為你收集整理的java 设计模式_快速上手Java设计模式之简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android radiobutton_
- 下一篇: 华阳太阳能怎么样