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è)事物。