盤錦網(wǎng)站建設(shè)多少錢合肥網(wǎng)站優(yōu)化軟件
一、設(shè)計(jì)模式
介紹
種一棵樹最好的時(shí)間是十年前,其次是現(xiàn)在?《援助的死亡》--?比薩·莫約
The best time to plant a tree was 10 years ago。?The second best time is now。?《dead aid》--?Dambisa Moyo?
1、創(chuàng)建型模式
1.1、單例模式
????????確保一個(gè)類最多只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn),可以分為預(yù)加載和懶加載。
1.2、原型模式
????????通過(guò)復(fù)制現(xiàn)有的實(shí)例來(lái)創(chuàng)建新的實(shí)例,無(wú)需知道相應(yīng)類的信息。其實(shí)就相當(dāng)于,在使用的時(shí)候剛好有這么一個(gè)對(duì)象,但是不能直接用,clone一個(gè)一模一樣的對(duì)象出來(lái),基本上就是原型模式。
? ? ? ? 深拷貝:將一個(gè)對(duì)象復(fù)制以后,基本數(shù)據(jù)類型會(huì)被重新創(chuàng)建,而引用類型,指向的還是原來(lái)對(duì)象指向的應(yīng)用。
? ? ? ? 淺拷貝:將一個(gè)對(duì)象復(fù)制后,不論是基本數(shù)據(jù)類型還有引用類型,都是重新創(chuàng)建的。簡(jiǎn)單來(lái)說(shuō),就是深拷貝進(jìn)行了完全徹底的復(fù)制,而淺拷貝不徹底。Java中clone,如果是基本類型則屬于深拷貝,如果包含了引用類型則屬于淺拷貝。
1.3、建造者模式
? ? ? ? 將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使得同樣的創(chuàng)建可以有不同的表示。
1.4、簡(jiǎn)單工廠模式
1.5、工廠方法模式
1.6、抽象工廠模式
2、行為型模式
2.1、策略模式
避免出現(xiàn)if-else、switch;
2.2、責(zé)任鏈模式
俗稱踢皮球。?把某一個(gè)請(qǐng)求放到某一個(gè)鏈?zhǔn)秸?qǐng)求當(dāng)中。請(qǐng)求的是會(huì)把鏈中的每一個(gè)對(duì)象都執(zhí)行一遍。?審批流程??梢詫⒄?qǐng)求和處理進(jìn)行解耦,請(qǐng)求處理者也就是節(jié)點(diǎn)對(duì)象只需要關(guān)系自己內(nèi)部處理的邏輯即可,?不感興趣的內(nèi)容可以繼續(xù)轉(zhuǎn)給下一個(gè)節(jié)點(diǎn)對(duì)象來(lái)處理。鏈?zhǔn)浇Y(jié)構(gòu)比較靈活,可以動(dòng)態(tài)的添加或者刪除節(jié)點(diǎn),易于拓展,符合開(kāi)閉原則。?使用的是要注意出現(xiàn)死循環(huán)的情況出現(xiàn),鏈太長(zhǎng)的化可能影響程序執(zhí)行的效率。
2.3、命令模式
在項(xiàng)目開(kāi)發(fā)的時(shí)候不會(huì)很常見(jiàn)。
2.4、觀察者模式
觀察者模式又稱為發(fā)布訂閱模式。
2.5、模板方法模式
定義算法的骨架,一次性實(shí)現(xiàn)算法中不變的部分,并將可變的部分交給子類來(lái)實(shí)現(xiàn),各個(gè)子類中公共的行為被提取出來(lái)并集中到一個(gè)公共的父類中,從而避免了代碼的重復(fù)。?模板方法中有一部分能力是開(kāi)放給子類的,整體的方法步驟父類已經(jīng)制定好了。模板方法一般通過(guò)繼承實(shí)現(xiàn),如果父類需要改的化,子類也需要改一遍,父類的穩(wěn)定很重要。
2.6、委派模式
委托書、老板和員工、老板下達(dá)任務(wù)給員工,員工完成以后,將結(jié)果給老板。?雙親委派模型、BeanDefinition、DispatcherServlet。?委派模式屬于行為性模式,代理模式屬于結(jié)構(gòu)型模式。?委派模式注重的結(jié)果,屬于一種特殊的靜態(tài)代理,全權(quán)代理。?委派模式注重的任務(wù)派遣,注重結(jié)果。?代理模式注重的是代碼的增強(qiáng),注重過(guò)程。
2.7、迭代器模式
迭代器模式又稱為游標(biāo)模式,提供一種順序訪問(wèn)元素或者集合中元素的方法,而無(wú)需暴露集合內(nèi)部表示,抽離集合對(duì)象的迭代行為到迭代器中,提供一致訪問(wèn)接口。?訪問(wèn)一個(gè)集合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示,為遍歷不通的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的訪問(wèn)接口。?將集合中的迭代功能,抽離出去,集合不用關(guān)心具體的迭代方法。?簡(jiǎn)單結(jié)構(gòu)不用迭代,復(fù)雜結(jié)構(gòu)使用迭代器 Map、List。日常開(kāi)發(fā)中用的比較少。
3、結(jié)構(gòu)型模式
3.1、代理模式
代理模式分為靜態(tài)代理、動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理、Cglib動(dòng)態(tài)代理)。?兩者的區(qū)別:Cglib采用的是繼承的方式,采用覆蓋父類的方法;JDK采用的是實(shí)現(xiàn)一個(gè)接口。?兩者的目的是一樣的:都是通過(guò)生成字節(jié)碼,重組成新的類。?JDK對(duì)用戶來(lái)說(shuō)更加復(fù)雜,目標(biāo)類必須實(shí)現(xiàn)一個(gè)接口;Cglib對(duì)目標(biāo)類沒(méi)有任何要求。效率更高,底層沒(méi)用用到反射。?JDK生成邏輯較為簡(jiǎn)單、執(zhí)行效率低。Cglib有個(gè)坑,即為目標(biāo)代理類不能有final修飾的方法,是不能被代理的。?SpringAop(面向切面編程)則使用的是動(dòng)態(tài)代理。一個(gè)切面就相當(dāng)于一個(gè)動(dòng)態(tài)代理。
3.2、門面模式
簡(jiǎn)單來(lái)說(shuō)門面模式就是代理模式,只不過(guò)是靜態(tài)代理。屬于一種特殊的靜態(tài)代理。門面模式的重點(diǎn)是在于封裝,靜態(tài)代理的重點(diǎn)在于增強(qiáng),不增強(qiáng)的靜態(tài)代理即為門面模式。?門面模式和單例模式,很多時(shí)候會(huì)把門面模式做成單例模式。?門面模式的優(yōu)點(diǎn):簡(jiǎn)化了調(diào)用的過(guò)程、建設(shè)系統(tǒng)的依賴、更好的劃分訪問(wèn)的層次、符合迪米特法則:最少知道原則。?門面模式不符合開(kāi)閉原則,因?yàn)樵诜庋b內(nèi)部邏輯發(fā)生變化的時(shí)候,門面需要改變。?門面模式可能會(huì)破壞單一職責(zé)原則,即所謂的萬(wàn)能類,會(huì)增加后期的維護(hù)成本。
3.3、裝飾器模式
比繼承更加具有擴(kuò)展性,更加靈活,把擴(kuò)展放到運(yùn)行的時(shí)候,可以透明的并且動(dòng)態(tài)的擴(kuò)展一個(gè)類功能。可以方便的時(shí)候在運(yùn)行的時(shí)候進(jìn)行擴(kuò)展、撤銷。?裝飾器模式像一種特殊的靜態(tài)代理,裝飾模式強(qiáng)調(diào)的是自身功能的拓展,是可以動(dòng)態(tài)定制的拓展,用戶自己說(shuō)了算,是一種透明的拓展。?代理模式強(qiáng)掉的是增強(qiáng),對(duì)用戶不透明,用戶沒(méi)有多少自主權(quán)。?裝飾器模式是繼承的有利補(bǔ)充,裝飾器模式完全遵守開(kāi)閉原則,裝飾器模式的代碼較多,會(huì)增加系統(tǒng)的復(fù)雜性,動(dòng)態(tài)裝飾的時(shí)候,代碼也更加復(fù)雜了。
3.4、享元模式
資源可以重復(fù)利用,避免系統(tǒng)中大量相似的對(duì)象創(chuàng)建,避免反復(fù)創(chuàng)建對(duì)象。享元模式大部分情況下都和工廠模式配合使用。共享數(shù)據(jù)庫(kù)鏈接。?享元模式是一種池化技術(shù),把經(jīng)常使用的對(duì)象提前緩存起來(lái)。JDBC鏈接池內(nèi)部采用享元模式,減少創(chuàng)建鏈接時(shí)候的耗時(shí)。?將現(xiàn)用的資源重復(fù)利用起來(lái),輕量級(jí)的模式,是一種線程池的模式。內(nèi)部狀態(tài):不變的狀態(tài),外部狀態(tài):變化的狀態(tài)?享元模式經(jīng)常用到系統(tǒng)底層的開(kāi)發(fā),以便解決系統(tǒng)的性能問(wèn)題;系統(tǒng)中有大量的相似對(duì)象、需要緩沖池的場(chǎng)景。?內(nèi)部狀態(tài):不變的內(nèi)容?外部狀態(tài):變化的內(nèi)容
3.5、組合模式
組合和聚合不同,組合中每個(gè)部件的生命周期是一樣的,同生共死,聚合則不然,聚合可以隨意拆解。組合模式也稱為整體部分模式。?盡量使用組合不要用繼承。心在一起叫團(tuán)隊(duì),人在一起叫團(tuán)伙。
3.6、適配器模式
適配器模式也叫變壓器模式,適配器模式用來(lái)解決兼容的情況??赡軙?huì)增加系統(tǒng)的復(fù)雜性。可能會(huì)降低代碼的可讀性。適配器模式分為類適配器、對(duì)象適配器、接口適配器,?其中多個(gè)接口可以用一個(gè)適配器實(shí)現(xiàn),也可以這多個(gè)接口拆分成多個(gè)適配器單獨(dú)處理,但是這樣可能就增加了代碼的復(fù)雜度了。
3.7、橋接模式
橋接模式是多重繼承的一種替代,為了將抽象的部分和具體的部分結(jié)合起來(lái),但是不通過(guò)繼承的方式來(lái)實(shí)現(xiàn)。通過(guò)組合的模式來(lái)代替繼承完成。?符合合成復(fù)用原則、符合開(kāi)放封閉原則,但是增加了理解的難度。屬于一種特殊的組合模式。
4、新設(shè)計(jì)模式
5、設(shè)計(jì)模式六大規(guī)則
單一職責(zé)原則:Single Responsibility Principle (SRP)
開(kāi)閉原則:Open Close Principle (OCP)
里是替換原則:Liskov Substitution Principle (LSP)
迪米特法則(最少知道原則): The Least Knowledge Principle (LKP)
接口隔離原則:Interface Segregation Principle (ISP)
依賴倒置原則:Dependency Inversion Principle(DIP)
6、設(shè)計(jì)模式總覽
設(shè)計(jì)模式用的好就是架構(gòu)師,用的不好就是碼農(nóng)
7、設(shè)計(jì)原則
每個(gè)人都有義烏捍衛(wèi)、遵守和完善原則,原則可以修正,但是不能肆意妄為。
SRP:?每個(gè)軟件模塊的職責(zé)要單一,衡量標(biāo)準(zhǔn)是模塊是否只有個(gè)被修改的原因,職責(zé)越單一,被修改的原因就越少,模塊的內(nèi)聚性越高,被復(fù)用可能性就越大,也更容易被理解。
OCP:?軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
LSP:?程序中父類型都應(yīng)該可以正確地被子類型替換,里是替換原則由2008年圖靈獎(jiǎng)得主,美國(guó)第一位計(jì)算機(jī)科學(xué)女博士Barbara Liskov教授和卡內(nèi)基.梅隆大學(xué)Jeannette Wing教授于1994年提出的。
ISP: 多個(gè)特定客戶端接口要好于一個(gè)寬泛用途的接口。接口隔離原則認(rèn)為不能強(qiáng)迫用戶去依賴那些他們不適用的接口, 換句話說(shuō),使用多個(gè)接口比使用單一的總接口要好。
DIP: 模塊之間的交互應(yīng)該依賴抽象,而非實(shí)現(xiàn),DIP要求高層模塊不應(yīng)該依賴于底層模塊,二者都應(yīng)該依賴于抽象,抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)依賴于抽象。
DRY: DRY原則特指在程序設(shè)計(jì)和計(jì)算中避免重復(fù)代碼。
YAGNI: 極限編程,提倡的原則,是指你自以為有用的功能,實(shí)際上都是用不到的,因此處理核心功能之外,其他的功能一概不要提前設(shè)計(jì),這樣可以大大加快開(kāi)發(fā)進(jìn)程。
Rule of Three:? 某個(gè)功能第三次出現(xiàn)的時(shí)候,就有必要進(jìn)行抽象化了,第一次用到某個(gè)功能時(shí),寫一個(gè)特定的解決方法,第二次用到的時(shí)候,復(fù)制上一次的代碼,第三次出現(xiàn)的時(shí)候,才著手抽象化,寫出通用的解決方法。
KISS: 真正的簡(jiǎn)單絕不是毫無(wú)設(shè)計(jì)感,上來(lái)就寫代碼,而是寶劍鋒從磨礪出,亮劍的時(shí)候猶如一到華麗的閃電,背后卻又大量的艱辛和積累,正真的簡(jiǎn)單不是不思考,而是先發(fā)散,再收斂,在紛繁復(fù)雜中,把握問(wèn)題的核心。
POLA: 寫代碼不是寫偵探小說(shuō),要的簡(jiǎn)單易懂,而不是是不是冒出個(gè) Surprise。