一拓提、簡(jiǎn)述
設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的隧膘、經(jīng)過(guò)分類的代态、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式的目的:為了代碼可重用疹吃、讓代碼更容易被理解蹦疑、保證代碼可靠性。 設(shè)計(jì)模式使代碼編寫(xiě)真正工程化萨驶,是軟件工程的基石脈絡(luò)歉摧,如同大廈的結(jié)構(gòu)一樣。
Java 中有 23 種設(shè)計(jì)模式篡撵,總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類:
- 【創(chuàng)建型模式】共 5 種:單例模式判莉、工廠方法模式、抽象工廠模式育谬、建造者模式券盅、原型模式。
- 【結(jié)構(gòu)型模式】共7種:適配器模式膛檀、橋接模式锰镀、組合模式、裝飾模式咖刃、外觀模式泳炉、享元模式、代理模式嚎杨。
- 【行為型模式】共11種:訪問(wèn)者模式花鹅、模板模式、策略模式枫浙、狀態(tài)模式刨肃、觀察者模式古拴、備忘錄模式、中介者模式真友、迭代器模式黄痪、解釋器模式、命令模式盔然、責(zé)任鏈模式桅打。
二、設(shè)計(jì)模式的六大原則
開(kāi)閉原則(Open Close Principle)
對(duì)擴(kuò)展開(kāi)放愈案,對(duì)修改關(guān)閉挺尾。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼刻帚,實(shí)現(xiàn)一個(gè)熱插拔的效果潦嘶。簡(jiǎn)言之,是為了使程序的擴(kuò)展性好崇众,易于維護(hù)和升級(jí)掂僵。想要達(dá)到這樣的效果,需要使用接口和抽象類顷歌。里氏代換原則(Liskov Substitution Principle)
面向?qū)ο笤O(shè)計(jì)的基本原則之一锰蓬。 里氏代換原則中說(shuō),任何基類可以出現(xiàn)的地方眯漩,子類一定可以出現(xiàn)芹扭。LSP 是繼承復(fù)用的基石,只有當(dāng)派生類可以替換掉基類赦抖,且軟件單位的功能不受到影響時(shí)舱卡,基類才能真正被復(fù)用,而派生類也能夠在基類的基礎(chǔ)上增加新的行為队萤。里氏代換原則是對(duì)開(kāi)閉原則的補(bǔ)充轮锥。
實(shí)現(xiàn)開(kāi)閉原則的關(guān)鍵步驟就是抽象化,而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn)要尔,所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范舍杜。依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)
這個(gè)原則是開(kāi)閉原則的基礎(chǔ)。
具體內(nèi)容:針對(duì)接口編程赵辕,依賴于抽象而不依賴于具體既绩。接口隔離原則(Interface Segregation Principle)
含義:使用多個(gè)隔離的接口,比使用單個(gè)接口要好还惠。另外一個(gè)含義:降低類之間的耦合度饲握。由此可見(jiàn),其實(shí)設(shè)計(jì)模式就是從大型軟件架構(gòu)出發(fā)、便于升級(jí)和維護(hù)的軟件設(shè)計(jì)思想救欧,它強(qiáng)調(diào)降低依賴歪今,降低耦合。迪米特法則颜矿,又稱最少知道原則(Demeter Principle)
一個(gè)實(shí)體應(yīng)當(dāng)盡量少地與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)獨(dú)立嫉晶。合成復(fù)用原則(Composite Reuse Principle)
盡量使用合成/聚合的方式皂岔,而不是使用繼承兜蠕。
開(kāi)閉原則具有理想主義的色彩,它是面向?qū)ο笤O(shè)計(jì)的終極目標(biāo)。其他幾條商蕴,則可以看做是開(kāi)閉原則的實(shí)現(xiàn)方法。
設(shè)計(jì)模式就是實(shí)現(xiàn)了這些原則艺晴,從而達(dá)到了代碼復(fù)用庶艾、增加可維護(hù)性的目的。
三状答、Spring 中用到的設(shè)計(jì)模式
1??代理模式:在 AOP 和 remoting 中被用的比較多冷守。
2??單例模式:在 Spring 配置文件中定義的 bean 默認(rèn)為單例模式。
3??模板模式:用來(lái)解決代碼重復(fù)的問(wèn)題惊科。比如 RestTemplate拍摇、JmsTemplate、JpaTemplate馆截。
4??委派模式:Spring 提供了 DispatcherServlet 來(lái)對(duì)請(qǐng)求進(jìn)行分發(fā)充活。
5??工廠模式:BeanFactory 用來(lái)創(chuàng)建對(duì)象的實(shí)例,貫穿于 BeanFactory/ApplicationContext 接口的核心理念蜡娶。
四混卵、JDK中常用的設(shè)計(jì)模式
1??單例模式用于 Runtime、Calendar 和其他的一些類中窖张。
2??工廠模式被用于各種不可變的類如 Boolean幕随,像 Boolean.valueOf。
3??觀察者模式被用于 swing 和很多的時(shí)間監(jiān)聽(tīng)中荤堪。
4??裝飾器模式被用于多個(gè) java IO 類合陵。
五、什么是 GOF(四人幫澄阳,全拼 Gang of Four)
在 1994 年拥知,由 Erich Gamma、Richard Helm碎赢、Ralph Johnson 和 John Vlissides 四人合著出版了一本名為 Design Patterns - Elements of Reusable Object-Oriented Software(中文譯名:設(shè)計(jì)模式 - 可復(fù)用的面向?qū)ο筌浖?的書(shū)低剔,該書(shū)首次提到了軟件開(kāi)發(fā)中設(shè)計(jì)模式的概念。四位作者合稱 GOF。他們所提出的設(shè)計(jì)模式主要是基于以下的面向?qū)ο笤O(shè)計(jì)原則:
1??對(duì)接口編程而不是對(duì)實(shí)現(xiàn)編程襟齿。
2??優(yōu)先使用對(duì)象組合而不是繼承姻锁。
六、裝飾模式(decorator design pattern)有何例子猜欺?它是作用于對(duì)象層次還是類層次位隶?
裝飾模式增強(qiáng)了單個(gè)對(duì)象的能力。Java IO 到處都使用了裝飾模式开皿,典型例子就是 Buffered 系列類如 BufferedReader 和 BufferedWriter涧黄,它們?cè)鰪?qiáng)了 Reader 和 Writer 對(duì)象,以實(shí)現(xiàn)提升性能的 Buffer 層次的讀取和寫(xiě)入赋荆。