Java設(shè)計(jì)模式與設(shè)計(jì)原則

Java 24 設(shè)計(jì)模式

一.策略模式(Strategy pattern)

? ? 1.策略的共同點(diǎn)抽象成接口,具體策略實(shí)現(xiàn)這個(gè)接口;

? ? 2.抽象一個(gè)策略接口的包裝容器Context,里面包裝策略的實(shí)現(xiàn)方法;

? ? 3.策略的具體執(zhí)行類(lèi),負(fù)責(zé)策略的最終應(yīng)用;

? ? 總結(jié):

? ? 策略模式體現(xiàn)高內(nèi)聚低耦合的特點(diǎn),把具體策略類(lèi),策略共同點(diǎn)抽象出的接口,及策略的執(zhí)行場(chǎng)景(上下文),具體的策略執(zhí)行類(lèi)分開(kāi);

二.代理模式(Proxy pattern)

? ? 1.定義一類(lèi)事物共同的特點(diǎn)(能執(zhí)行的操作)抽象成接口

? ? 2.具體的事物類(lèi),實(shí)現(xiàn)這個(gè)接口,及具體執(zhí)行的操作

? ? 3.如果其中一個(gè)事物類(lèi)不能做這些事,可以將其定義成其他事物類(lèi)的代理

? ? 4.定義成其他事物類(lèi)的代理的類(lèi),要實(shí)現(xiàn)兩個(gè)構(gòu)造方法,一個(gè)是定義默認(rèn)代理的事物類(lèi),一個(gè)是可以任意定義代理的事物類(lèi);實(shí)現(xiàn)以后的復(fù)用;

? ? 總結(jié): 代理模式體現(xiàn)java的多態(tài)特性,代理類(lèi)接到任務(wù)交給其他被代理的類(lèi)去完成,前提是代理類(lèi)和被代理類(lèi)實(shí)現(xiàn)同一個(gè)接口;

三.單例模式(Singleton pattern)

? ? 1.類(lèi)的構(gòu)造方法是私有的

? ? 2.類(lèi)中有一個(gè)獲取類(lèi)實(shí)例的靜態(tài)方法

? ? 3.多線(xiàn)程情況還要考慮線(xiàn)程同步獲取實(shí)例的方法

? ? 總結(jié):

? ? 單例模式用在要且只要一個(gè)對(duì)象的類(lèi),保證類(lèi)實(shí)例的唯一性;

四.多例模式(有上限的多例模式)(Mulition pattern)

? ? 1.類(lèi)的構(gòu)造方法是私有的

? ? 2.把獲取實(shí)例的方法放在靜態(tài)代碼塊中,把獲取的實(shí)例放在List中

? ? 3.多線(xiàn)程情況很少

? ? 總結(jié):

? ? 多列模式,但實(shí)例的數(shù)量有個(gè)上限,需要根據(jù)具體情況設(shè)置。

五.簡(jiǎn)單工廠模式(Simple factory pattern)

? ? 1.把要產(chǎn)生的類(lèi)的共性抽象成一個(gè)接口

? ? 2.具體的類(lèi)實(shí)現(xiàn)這個(gè)接口

? ? 3.寫(xiě)一個(gè)產(chǎn)生類(lèi)的工廠方法

? ? 4.寫(xiě)一個(gè)利用工廠制造類(lèi)的操作者類(lèi)

? ? 總結(jié):

? ? 簡(jiǎn)單工廠模式簡(jiǎn)化了生成具體對(duì)象,我們所需要的只需要修改對(duì)象對(duì)應(yīng)的類(lèi)的共同屬性就可以實(shí)現(xiàn),工廠類(lèi)完成其他操作

六.抽象工廠模式(Abstract factory pattern)

? ? 1.定義最終目標(biāo)類(lèi)的共性成一個(gè)接口

? ? 2.定義要最終目標(biāo)類(lèi)的抽象類(lèi),實(shí)現(xiàn)目標(biāo)類(lèi)共性定義的接口

? ? 3.定義目標(biāo)類(lèi)中幾個(gè)不同的屬性的具體執(zhí)行類(lèi)繼承對(duì)應(yīng)的抽象類(lèi)

? ? 4.根據(jù)工廠類(lèi)最終要實(shí)現(xiàn)的方法,定義一個(gè)工廠類(lèi)接口

? ? 5.定義一個(gè)包含通用方法的抽象類(lèi),實(shí)現(xiàn)工廠類(lèi)接口

? ? 6.根據(jù)具體需要,創(chuàng)建具體實(shí)現(xiàn)工廠類(lèi),繼承抽象類(lèi)

? ? 總結(jié):

? ? 工廠模式符合開(kāi)閉原則(OCP),在產(chǎn)品中增加一類(lèi)產(chǎn)品,再增加一個(gè)工廠方法就可以了。

七.門(mén)面模式(Facade pattern)

? ? 1.根據(jù)處理某類(lèi)事件的具體操作定義一個(gè)接口

? ? 2.定義一個(gè)具體實(shí)現(xiàn)上面接口的實(shí)現(xiàn)類(lèi)

? ? 3.定義一個(gè)類(lèi)把所有操作封裝在一個(gè)方法里

? ? 4.定義一個(gè)需要這些操作的客戶(hù)端

? ? 總結(jié):

? ? 門(mén)面模式把一些復(fù)雜的操作封裝起來(lái),讓用戶(hù)感覺(jué)操作起來(lái)十分簡(jiǎn)便。如果操作流程改了,只需要改少量代碼即可達(dá)到需求。

八.適配器模式(Adapter pattern)

? ? 1.定義一個(gè)適配者所有的操作接口

? ? 2.定義一個(gè)類(lèi)實(shí)現(xiàn)這個(gè)適配者操作接口

? ? 3.定義一個(gè)被適配者所有操作的接口

? ? 4.定義一個(gè)類(lèi)實(shí)現(xiàn)被適配者操作接口

? ? 5.定義一個(gè)連接兩者的適配器

? ? 6.定義一個(gè)需要具體操作的類(lèi)

? ? 總結(jié):

? ? 適配器模式不適合在設(shè)計(jì)階段使用,主要應(yīng)用在擴(kuò)展修改系統(tǒng)功能時(shí)使用,使用適配器模式減少原有系統(tǒng)代碼修改。

九.模板模式(Template pattern)

? ? 1.定義一個(gè)頂級(jí)抽象類(lèi)模型,包含基本方法和模板方法(基本方法的組合)

? ? 2.定義具體的對(duì)象模型類(lèi),繼承頂級(jí)抽象模型類(lèi)

? ? 3.定義執(zhí)行操作類(lèi)

? ? 總結(jié):

? ? 模板方式在(struts2)應(yīng)用挺多,提供一個(gè)抽象類(lèi),然后修改其protected方法,實(shí)現(xiàn)具體的功能,然后調(diào)用一個(gè)execute方法,完成操作。父類(lèi)調(diào)用子類(lèi)的方法,在項(xiàng)目中不建議使用

十.建造者模式(Builder pattern)

? ? 1.前一部分如同模板模式

? ? 2.根據(jù)實(shí)際需求創(chuàng)建一個(gè)建造者抽象類(lèi),定義建造者用到的方法

? ? 3.根據(jù)具體需要被造的物體設(shè)計(jì)對(duì)象制造者類(lèi),繼承建造者抽象類(lèi)

? ? 4.根據(jù)客戶(hù)最終需要設(shè)計(jì)指導(dǎo)者類(lèi),確定具體建造流程

? ? 5.定義執(zhí)行操作類(lèi)

? ? 總結(jié):

? ? 建造者模式適合產(chǎn)品類(lèi)復(fù)雜繁多的情況,就是業(yè)務(wù)較復(fù)雜時(shí)。還有對(duì)象在創(chuàng)建過(guò)程中使用到其他不易得到的對(duì)象。

十一.橋梁模式(Bridge pattern)

? ? 1.定義一個(gè)最終目的產(chǎn)品抽象類(lèi),包含對(duì)應(yīng)的抽象操作方法

? ? 2.定義最終產(chǎn)品類(lèi),繼承上面的目的產(chǎn)品抽象類(lèi),重寫(xiě)抽象操作方法

? ? 3.定義一個(gè)負(fù)責(zé)生產(chǎn)最終目的產(chǎn)品的抽象公司類(lèi),包含公司類(lèi)要實(shí)現(xiàn)的方法

? ? 4.定義生產(chǎn)具體產(chǎn)品的公司類(lèi)繼承抽象公司類(lèi),重寫(xiě)抽象公司類(lèi)的方法

? ? 5.定義執(zhí)行操作類(lèi)

? ? 總結(jié):

? ? 橋梁模式的優(yōu)點(diǎn)是類(lèi)間解耦,使類(lèi)間的聯(lián)系弱化。業(yè)務(wù)抽象角色引用業(yè)務(wù)實(shí)現(xiàn)角色

十二.命令模式(Command pattern)

? ? 1.根據(jù)命令的最終接受者執(zhí)行的操作,定義抽象命令接收者命令

? ? 2.定義命令接收者類(lèi),繼承上面定義的抽象類(lèi)

? ? 3.定義命令抽象類(lèi),包含一個(gè)execute方法

? ? 4.定義具體的命令類(lèi)

? ? 5.定義命令調(diào)度者類(lèi),接收命令并布置具體執(zhí)行

? ? 總結(jié):

? ? 命令模式具備很好的封裝性,把命令的請(qǐng)求方和執(zhí)行方分開(kāi)了。但如果業(yè)務(wù)邏輯復(fù)雜,Command類(lèi)會(huì)過(guò)于復(fù)雜,在實(shí)際項(xiàng)目中類(lèi)會(huì)膨脹。

十三.裝飾模式(Decorator pattern)

? ? 1.定義一個(gè)最原始的,被修飾的核心類(lèi)

? ? 2.定義具體的被裝飾的具體類(lèi),繼承核心類(lèi)

? ? 3.定義一個(gè)裝飾抽象類(lèi)

? ? 4.根據(jù)具體的被裝飾類(lèi),定義裝飾類(lèi)

? ? 5.定義要查看最終被裝飾產(chǎn)品的類(lèi)

? ? 總結(jié):

? ? 裝飾模式是對(duì)繼承的補(bǔ)充,裝飾模式是給類(lèi)動(dòng)態(tài)的增加功能

十四.迭代器模式(Iterator pattern)

? ? 1.定義一個(gè)具體項(xiàng)目迭代器接口繼承java.util.Iterator類(lèi)

? ? 2.定義一個(gè)項(xiàng)目使用的迭代器類(lèi),實(shí)現(xiàn)上面那個(gè)接口

? ? 3.定義有一個(gè)對(duì)項(xiàng)目的操作接口

? ? 4.定義具體的項(xiàng)目操作類(lèi)實(shí)現(xiàn)上面的接口

? ? 5.定義項(xiàng)目的最終操作類(lèi)

? ? 總結(jié):

? ? Java已經(jīng)把迭代器給我們準(zhǔn)備好了,項(xiàng)目很少再獨(dú)立寫(xiě)迭代器了,直接用List或Map就可以解決問(wèn)題。

十五.組合模式(Compsite pattern)

? ? 1.定義一個(gè)實(shí)現(xiàn)所需功能的抽象類(lèi)

? ? 2.根絕具體所需生成的對(duì)象定義類(lèi),繼承上面的抽象類(lèi)

? ? 3.定義跟節(jié)點(diǎn)類(lèi),及接口

? ? 總結(jié):

? ? 組合模式分為安全模式和透明模式,提供一套組合方法,適合樹(shù)形結(jié)構(gòu)或者局部與整體的關(guān)系。

十六.觀察者模式(Observer pattern)

? ? 1.定義一個(gè)被觀察者實(shí)現(xiàn)Observable接口。

? ? 2.觀察者實(shí)現(xiàn)Observer接口。

? ? 3.操作類(lèi)實(shí)現(xiàn)具體操作

? ? 總結(jié):

? ? 觀察者和被觀察者自己沒(méi)有任何聯(lián)系,方便以后的擴(kuò)展和維護(hù)。

十七.責(zé)任鏈模式(Chain of Responsility pattern)

? ? 1.根據(jù)請(qǐng)求對(duì)象的屬性,定義一個(gè)接口

? ? 2.定義具體的請(qǐng)求對(duì)象類(lèi)

? ? 3.根據(jù)請(qǐng)求處理者類(lèi)抽象一個(gè)Handler類(lèi)

? ? 4.定義具體的請(qǐng)求處理者類(lèi),繼承上面的抽象類(lèi)

? ? 總結(jié):

? ? 責(zé)任鏈模式是請(qǐng)求者不必考慮誰(shuí)是處理者,只要請(qǐng)求發(fā)出,就會(huì)有處理者,Handler的子類(lèi)可以繼續(xù)增加下去。調(diào)用者不用了解變化過(guò)程。

十八.訪(fǎng)問(wèn)者模式(Visitor pattern)

? ? 1.定義一個(gè)訪(fǎng)問(wèn)者超級(jí)接口

? ? 2.定義具體的訪(fǎng)問(wèn)者接口,包含訪(fǎng)問(wèn)者要實(shí)現(xiàn)的方法

? ? 3.定義具體的訪(fǎng)問(wèn)者實(shí)現(xiàn)類(lèi)

? ? 4.定義被訪(fǎng)問(wèn)的對(duì)象的抽象類(lèi)

? ? 5.實(shí)現(xiàn)具體的被訪(fǎng)問(wèn)對(duì)象繼承上面的類(lèi)

? ? 6.執(zhí)行操作類(lèi)

? ? 總結(jié):

? ? 訪(fǎng)問(wèn)者模式是訪(fǎng)問(wèn)者對(duì)象和被訪(fǎng)問(wèn)者對(duì)象隔離,根據(jù)訪(fǎng)問(wèn)者模式能實(shí)現(xiàn)簡(jiǎn)單的Interceptor

十九.狀態(tài)模式(State pattern)

? ? 1.定義要表示的對(duì)象抽象出來(lái)的接口

? ? 2.定義具體的對(duì)象類(lèi),實(shí)現(xiàn)上面定義的接口

? ? 3.定義對(duì)象狀態(tài)的抽象類(lèi)

? ? 4.定義對(duì)象處于的環(huán)境上下文類(lèi)

? ? 5.定義對(duì)象會(huì)處于的具體狀態(tài)類(lèi)

? ? 6.客戶(hù)端執(zhí)行類(lèi)

? ? 總結(jié):

? ? 狀態(tài)模式,當(dāng)一個(gè)對(duì)象內(nèi)在狀態(tài)改變時(shí),允許其改變行為,看起來(lái)好像對(duì)象對(duì)應(yīng)的類(lèi)發(fā)生了改變,但子類(lèi)會(huì)太多。

二十.原型模式(Prototype pattern)

? ? 1.寫(xiě)一個(gè)要被創(chuàng)建的對(duì)象類(lèi)的模板類(lèi)

? ? 2.定義要被clone的對(duì)象類(lèi)

? ? 3.客戶(hù)端執(zhí)行操作

? ? 總結(jié):

? ? 原型模式是對(duì)通過(guò)對(duì)已有對(duì)象的拷貝創(chuàng)建新對(duì)象。既能節(jié)約硬件資源也能有效保護(hù)元對(duì)象不被修改。

二十一.中介者模式(Mediator pattern)

? ? 1.定義抽象的中介者類(lèi),具體的中介者去繼承這個(gè)類(lèi)

? ? 2.定義中介這要協(xié)調(diào)的同伴類(lèi)

? ? 3.定義要執(zhí)行具體操作的類(lèi)

? ? 4.客戶(hù)端調(diào)用執(zhí)行

? ? 總結(jié):

? ? 中介者模式實(shí)現(xiàn)很好的封裝,是類(lèi)間的依賴(lài)減少。

二十二.解釋器模式(Interpreter pattern)

? ? 1.聲明一個(gè)表達(dá)式都要實(shí)現(xiàn)的抽象類(lèi),包含interpret()方法

? ? 2.具體的表達(dá)式類(lèi),繼承上面的抽象類(lèi),實(shí)現(xiàn)具體的方法

? ? 3.表達(dá)式運(yùn)行的上下文環(huán)境類(lèi)

? ? 4.客戶(hù)端調(diào)用執(zhí)行類(lèi)

? ? 總結(jié):

? ? 定義一個(gè)語(yǔ)句,解釋器模式可以定義出其文法的一種表示,并提供一個(gè)解釋器,客戶(hù)端可以利用解釋器來(lái)解釋這個(gè)語(yǔ)句。

二十三.亨元模式(Flyweight pattern)

? ? 1.定義只有內(nèi)蘊(yùn)狀態(tài)的類(lèi),內(nèi)蘊(yùn)狀態(tài)不會(huì)改變可以共享

? ? 2.定義含有外蘊(yùn)對(duì)象的類(lèi),外蘊(yùn)狀態(tài)會(huì)隨環(huán)境改變而改變,不可以共享

? ? 3.單純亨元模式和符合亨元模式

? ? 總結(jié):

? ? 亨元模式可以有效降低內(nèi)存中對(duì)象的數(shù)量,但會(huì)使系統(tǒng)變復(fù)雜,將亨元對(duì)象的狀態(tài)外部化,讀取外部狀態(tài)的時(shí)間會(huì)變長(zhǎng)。

二十四.備忘錄模式

? ? 1.定義一個(gè)備忘錄類(lèi)接口,起標(biāo)識(shí)作用

? ? 2.定義一個(gè)備忘錄類(lèi),保存狀態(tài)信息

? ? 3.定義一個(gè)發(fā)起者,負(fù)責(zé)改變狀態(tài)

? ? 總結(jié):

? ? 備忘錄模式,可以有效恢復(fù)對(duì)象的狀態(tài)。在不破壞封裝的前提下,將對(duì)象的狀態(tài)捕捉。

Java 6個(gè)設(shè)計(jì)原則

一.單一職責(zé)原則

? ? 接口做到單一職責(zé),一個(gè)接口定義一類(lèi)方法屬性,類(lèi)盡量只有一個(gè)原因引起變化。

二.里氏替換原則

? ? 里氏替換原則目的是加強(qiáng)程序的健壯性,在版本升級(jí)時(shí)可以做到非常好的兼容性,一個(gè)類(lèi)的修改,不會(huì)影響其他類(lèi)的正常運(yùn)行。

三.依賴(lài)注入原則

? ? 把各個(gè)類(lèi)間的依賴(lài)關(guān)系交給第三方進(jìn)行管理,類(lèi)間沒(méi)有直接的依賴(lài)關(guān)系,或依賴(lài)很弱,調(diào)用者不需要考慮類(lèi)之間的依賴(lài)關(guān)系,后期對(duì)項(xiàng)目的維護(hù)也會(huì)相對(duì)簡(jiǎn)單。這樣這些就實(shí)現(xiàn)了高內(nèi)聚低耦合。

四.接口隔離原則

? ? 根據(jù)接口隔離原則拆分接口時(shí),必須滿(mǎn)足單一職責(zé)原則。接口隔離原則實(shí)現(xiàn)高內(nèi)聚,并可提供定制化服務(wù)

五.迪米特法則

? ? 出現(xiàn)在成員變量,方法的輸入輸出參數(shù)中的類(lèi)被稱(chēng)為成員朋友類(lèi),一個(gè)類(lèi)只和朋友類(lèi)交流。

? ? 對(duì)外公布盡量少的public方法和非靜態(tài)的public變量,盡量?jī)?nèi)斂,如果能設(shè)置成最終不可改變,盡量就加上final關(guān)鍵字,如果方法放在本類(lèi)中,既不增加類(lèi)間關(guān)系,對(duì)本類(lèi)不產(chǎn)生負(fù)面影響,就放置在本類(lèi)中

六.開(kāi)閉原則

? ? 一個(gè)軟件應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉,保證模塊在不被修改的前提下被擴(kuò)展。滿(mǎn)足可復(fù)用和易維護(hù),核心是抽象一個(gè)事物。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,081評(píng)論 1 15
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨(dú)雜貨鋪閱讀 1,634評(píng)論 0 3
  • 家里有倆個(gè)男人 一個(gè)頑固 一個(gè)執(zhí)拗 頑固的那個(gè) 為了勤儉 什么都舍不得 執(zhí)拗的那個(gè) 將關(guān)心藏在心底 倆個(gè)人吵得不可...
    舞嫵閱讀 168評(píng)論 0 1

友情鏈接更多精彩內(nèi)容