
UML建模
??碪ML建模,但是里面的關(guān)系經(jīng)常很難記憶,此處記錄一下。UML的六種關(guān)系:泛化、實現(xiàn)、關(guān)聯(lián)、聚合、組合、依賴。
泛化
指的是繼承關(guān)系,表達一般和特殊。符號:空心三角箭頭的實線,箭頭指向父類。
實現(xiàn)
指的是類與接口的關(guān)系,表達類實現(xiàn)了接口的特征行為。符號:帶三角箭頭的虛線,箭頭指向接口。
關(guān)聯(lián)
指的是類和類的關(guān)系,表達一個類知道另一個類的屬性和方法。符號:帶普通箭頭(或?qū)嵭娜切渭^)的實心線。
聚合
指的是整體和部分關(guān)系,且部分可以離開整體而單獨存在。符號:空心菱形的實心線,菱形指向整體。
組合
指的是整體與部分的關(guān)系, 但部分不能離開整體而單獨存在。符號:帶實心菱形的實線,菱形指向整體。
依賴
指的是使用的關(guān)系, 即一個類的實現(xiàn)需要另一個類的協(xié)助, 所以要盡量不使用雙向的互相依賴。符號:帶箭頭的虛線,指向被依賴的類。
設(shè)計模式原則
單一職責(zé):一個類就干一件事。
開閉原則:對擴展開放,對修改關(guān)閉。
里氏代換原則:子類不能修改父類的功能。
合成/聚合復(fù)用原則:用接口實現(xiàn),避免使用繼承。
依賴倒轉(zhuǎn)原則:針對接口編程,不針對實現(xiàn)編程。
迪米特法則:類和類之間低耦合,高內(nèi)聚。
接口隔離原則:接口盡量細化。
創(chuàng)建型設(shè)計模式
單例模式
實現(xiàn):保證類只能有一個對應(yīng)的實例。
如果不管需要不需要上來就創(chuàng)建實例,那么就是飽漢式。
如果等到需要的時候創(chuàng)建實例,那么就是懶漢式。
簡單工廠模式
實現(xiàn):將創(chuàng)建對象的邏輯封裝到一個工廠,使用if-else語句來根據(jù)不同條件創(chuàng)建多個不同對象。
工廠方法模式
針對簡單工廠模式,由于創(chuàng)建對象需要if-else,如果創(chuàng)建一個新對象,還得修改工廠類,不符合開閉原則。
實現(xiàn):定義工廠接口。當需要創(chuàng)建新對象時候,先創(chuàng)建新工廠(一個工廠對應(yīng)創(chuàng)建一種對象)。
抽象工廠模式
針對工廠方法模式,一工廠創(chuàng)建一對象,但是會產(chǎn)生大量的工廠并且每個工廠還想要創(chuàng)建一類對象。
實現(xiàn):定義抽象工廠接口(滿足一個工廠創(chuàng)建一類對象),創(chuàng)建不同工廠實現(xiàn)抽象工廠接口,創(chuàng)建一類對象。
簡單工廠 vs 工廠方法 vs 抽象工廠
簡單工廠,就是一個工廠實現(xiàn)全部邏輯。
工廠方法,一個工廠創(chuàng)建一種對象。
抽象工廠,一個工廠創(chuàng)建一類對象。
建造者模式
針對上面三個工廠模式,可以看到關(guān)注點都在創(chuàng)建對象,并沒有提及對象的功能和行為。而建造者模式主要關(guān)注對象的行為和功能。創(chuàng)建一個類似的對象。
實現(xiàn):定義抽象建造者接口,通過具體建造者實現(xiàn)該接口具體產(chǎn)品。定義指揮者構(gòu)建建造者,建造者再創(chuàng)建產(chǎn)品。
原型模式
實現(xiàn):拷貝復(fù)制對象,從而創(chuàng)建對象。
淺拷貝:直接使用clone方法拷貝,與原對象有關(guān)系。
深拷貝:創(chuàng)建新對象,把原對象屬性設(shè)置到新對象,原對象無關(guān)系。
結(jié)構(gòu)型設(shè)計模式
代理模式
目的:生成代理對象,代理對象實現(xiàn)原有對象的功能。
實現(xiàn):創(chuàng)建代理類實現(xiàn)真實類需要的接口,調(diào)用真實類方法,代替它實現(xiàn)方法。
裝飾器模式
實現(xiàn):為方法添加新的功能,編寫新方法,調(diào)用老方法,在老方法前后加入自己新實現(xiàn)。主要是包裝老方法。
組合模式
目的:用于有部分與整體這種層次結(jié)構(gòu),忽略了組合對象和部分單個對象的不同,可以統(tǒng)一的使用組合結(jié)構(gòu)中的對象。
實現(xiàn):整體與局部(樹形結(jié)構(gòu))進行遞歸組合。
外觀模式
目的:對外提供一個統(tǒng)一的接口用來訪問子系統(tǒng),而使這些子系統(tǒng)更加容易被訪問的模式。主要是無需關(guān)心子系統(tǒng)代碼實現(xiàn)細節(jié)。
實現(xiàn):子系統(tǒng)方法,組合到新方法中。
適配器模式
接口不兼容的類一起工作。為了適配新接口,那么就實現(xiàn)新接口的方法即可。
類適配實現(xiàn):類A的方法,無法完成新接口B的功能。設(shè)計一個適配器類C,繼承類A,實現(xiàn)B接口,完成B的方法,如果需要老功能,那么直接調(diào)用父類A的方法,這樣通過適配類C就可以完成B接口。
對象適配實現(xiàn):在類適配的基礎(chǔ)上,將原本通過繼承父類方式調(diào)用父類的老功能,改成組合的方式調(diào)用。
橋接模式
目的:將實現(xiàn)和抽象放在兩個不同的類層次中,使兩個能夠獨立變化的部分分離開來。
實現(xiàn):將具體類抽象為抽象類,將方法的實現(xiàn)抽象為接口,將接口與抽象類組合。
享元模式
目的:使用HashMap減少重復(fù)對象的產(chǎn)生。重用現(xiàn)有的同類對象,如果未找到匹配的對象,則創(chuàng)建新對象。
實現(xiàn):將對象存放到容器中,譬如數(shù)組、HashMap,減少對象數(shù)量。場景:java.lang.Integer類的cache實現(xiàn)。
行為型設(shè)計模式
策略模式
目的:定義一系列算法的方法,并且這些算法都完成相同的工作,只是實現(xiàn)不同,使用相同的方式調(diào)用所有的算法,減少了算法之間的耦合,并且每個算法都是獨立的,可以對每個算法的接口進行單獨的測試。
實現(xiàn):一個接口多個實現(xiàn)類。
模板方法模式
目的:通過模板來固定操作的流程。通過子類實現(xiàn)模板方法。
實現(xiàn):定義一個抽象類模板,然后將抽象方法延伸到其子類去實現(xiàn)。
迭代器模式
目的:順序的訪問集合中的對象。
實現(xiàn):定義一個迭代器類實現(xiàn)訪問集合方法接口,里面實現(xiàn)了集合是否有元素、獲取前一個元素、獲取后一個元素、取第一個、最后一個元素的方法。這樣通過迭代器就可以訪問集合了。
場景:java.uti.Iterator接口集合訪問定義。
狀態(tài)模式
目的:將對象的狀態(tài)與實現(xiàn)分離,根據(jù)不同狀態(tài)做出不同的行為。
實現(xiàn):定義抽象狀態(tài)類,實現(xiàn)不同狀態(tài)類。定義上下文實現(xiàn)不同狀態(tài)類,實際將上下文的執(zhí)行權(quán)力又移交到狀態(tài)類。
觀察者模式
目的:當多個觀察者類訂閱一個主題時,當主題變化會通知這些觀察者。
實現(xiàn):定義抽象主題,將實現(xiàn)延伸到具體主題。定義抽象觀察者,將實現(xiàn)延伸到不同具體觀察者。將觀察者注冊到主題中,那么主題變化,直接調(diào)用觀察者來執(zhí)行方法,就實現(xiàn)了通知。
命令模式
目的:將請求封裝成命令,定義命令類,記錄命令,可以將命令發(fā)布、撤銷、重做。便于命令發(fā)出者與實現(xiàn)者分離,都面對命令,實現(xiàn)其解耦。
實現(xiàn):定義抽象命令類,實現(xiàn)具體業(yè)務(wù)的命令實現(xiàn)類。然后實現(xiàn)命令發(fā)布者操作命令行為,實現(xiàn)命令與命令實現(xiàn)者行為。
中介者模式
目的:將對象之間的交互行為進行抽象。尤其是與很多對象交互操作,很復(fù)雜,那么就可以通過中介者來完成與多個對象交互。
實現(xiàn):定義一個抽象中介者,實現(xiàn)具體業(yè)務(wù)的中介者。定義抽象交互對象,實現(xiàn)具體交互對象,通過中介者來訪問交互對象。
備忘錄模式
目的:定義類保存對象的狀態(tài),在需要的時候恢復(fù)。
實現(xiàn):定一個備忘錄類,在源類里面,實現(xiàn)一個創(chuàng)建備忘錄對象方法。實現(xiàn)一個將備忘錄對象更新數(shù)據(jù)到源對象的方法。
訪問者模式
目的:將對象的數(shù)據(jù)結(jié)構(gòu)與對象操作數(shù)據(jù)結(jié)構(gòu)的方法分離解耦。應(yīng)對數(shù)據(jù)結(jié)構(gòu)不變,操作方法變化的情況。應(yīng)對方式為增加訪問者即可。
實現(xiàn):定一個固定的數(shù)據(jù)結(jié)構(gòu)類,定義抽象數(shù)據(jù)類,定義多個數(shù)據(jù)實現(xiàn)類。數(shù)據(jù)結(jié)構(gòu)類就是按照規(guī)則排布抽象數(shù)據(jù)類。想要實現(xiàn)不同數(shù)據(jù)的操作,那么就新增對應(yīng)的中介者。
職責(zé)鏈模式
目的:將事件沿著鏈去處理。請求者與接收者卻毫無關(guān)系并且請求者對于到底是誰處理了請求也全然不知。
實現(xiàn):定義多個類,類與類之間只能兩兩訪問。調(diào)用傳入的其他一個類的方法,一直往下傳遞調(diào)用。
解釋器模式
目的:使用類來定義語法,并對其進行解釋。通過繼承等機制來改變或擴展語法。
實現(xiàn):定義多個語法規(guī)則類,定義計算類來解析語法,解析過程,調(diào)用語法規(guī)則類。
設(shè)計模式實際應(yīng)用
工廠模式+策略模式
針對業(yè)務(wù)中那種分發(fā)情況,使用工廠模式,譬如在醫(yī)療系統(tǒng)中,在工廠里面判斷,如果這個人是孕產(chǎn)婦,那么使用孕產(chǎn)婦的那一套檢查流程,那么就調(diào)用孕產(chǎn)婦服務(wù)接口。如果這個人是65歲以上老人,那么就是用老年人的那一套檢查流程,那么就調(diào)用65歲以上老人接口。
裝飾器模式+代理模式
針對AOP設(shè)計中,在使用動態(tài)代理,生成代理對象,會在代理對象前后分別實現(xiàn)個性化邏輯,增強原來方法,實現(xiàn)裝飾器模式。
模板方法模式+策略模式
針對醫(yī)療系統(tǒng)中,居民身份審核流程,一般都是層層上報,譬如鄉(xiāng)鎮(zhèn)衛(wèi)生院新增一位孕產(chǎn)婦,那么需要將數(shù)據(jù)報到縣級醫(yī)院批準,縣級醫(yī)院需要報到地市級醫(yī)院批準,地市級醫(yī)院報到省級醫(yī)院批準。而65歲以上老人、新生兒都是同樣的上報流程,那么我們可以將這個流程固定,創(chuàng)建模板方法抽象類,審核方法不變,但是上報內(nèi)容方式抽象方法我們延伸到子類去實現(xiàn)邏輯。至于上報方式我們也可以選用不同策略,線下手填上報方式,線上掃碼填報方式等。