一句話總結java23種設計模式
http://smallbug-vip.iteye.com/blog/2276470
1、開閉原則(Open Close Principle):對擴充套件開放對修改關閉
2、里氏代換原則(Liskov Substitution Principle):父類出現的地方,子類也可出現
3、依賴倒轉原則(Dependence Inversion Principle):依賴抽象而不依賴具體
4、介面隔離原則(Interface Segregation Principle):多個隔離的介面,比使用單個介面要好
5、迪米特法則(最少知道原則)(Demeter Principle):最少知道原則。一個實體應當儘量少的與其他實體之間發生相互作用
6、合成複用原則(Composite Reuse Principle):儘量使用合成/聚合的方式,而不是使用繼承。
建立型模式(五種)
- 工廠方法模式(Factory):工廠建立物件(經典實現:很多框架初始化時都會建立一個工廠物件,用來載入資源)
- 抽象工廠模式(Abstractfactory):抽象工廠例項建立物件,工廠可修改,靈活度高(經典實現:Struts2外掛機制的核心實現就是BeanFactory這個抽象工廠。Spring IOC載入Bean,AOP建立Proxy)
- 單例模式(Sington):適用於只需要一個物件的情況(經典實現:Tomcat中StringManager的錯誤處理機制)
- 建造者模式(Builder):一步一步建立一個複雜的物件(經典實現:MyBatis中的SQLSession就是結合了Configure,executor等物件,以此來實現SQLSession的複雜功能)
- 原型模式(Prototype):複製物件,包括深度複製和淺度複製,深度複製重建引用物件,淺度複製不建立(經典實現:java序列化)
結構型模式(七種)
- 介面卡模式(Adapter):通過實現介面,依賴注入,繼承等方式為不相關的實體建立關係(經典實現:Tomcat新版本聯結器Coyote,就是通過為Connector適配建立了ProtocolHandler與Tomcat元件Connector的關聯關係)
- 裝飾器模式(Decorator):建立包裝物件修飾擴充套件被包裝物件的功能(經典實現:IO家族中BufferedXxx)
- 代理模式(Proxy):通過新增中間代理的方式限制,過濾,修改被代理類的某些行為(經典實現:Spring AOP核心實現,DataSource中為Connection建立代理物件,改變close方法的行為,使其從開始的關閉連線變成將連線還回連線池)
- 外觀模式(Facade):通過外觀的包裝,使應用程式只能看到外觀物件,而不會看到具體的細節物件。(經典實現:Tomcat中建立外觀類包裝StandardContext傳給Wrapper,建立外觀類包裝Wrapper以ServletConfiguration的形式傳給Servlet,以此來遮蔽不想讓Servlet可見的那些Tomcat容器引數)
- 橋接模式(Bridge):將抽象部分與它的實現部分分離,使它們都可以獨立地變化(經典實現:JDBC驅動)
- 組合模式(Composite):部分與整體,常用於表示樹形結構
- 享元模式(Flyweight):維護資源集合(經典實現:資料庫連線池,避免重新開啟資料庫連結的開銷)
行為型模式(十一種)
- 策略模式(Strategy):定義多個不同的實現類,這些類實現公共介面,通過呼叫介面呼叫不同例項得到不同結果(經典實現:Spring中Bean的定義與注入,Controller,Servcie,repository三層架構中只依賴上一層介面)
- 模板方法模式(Template):父類定義公共方法,不同子類重寫父類抽象方法,得到不同結果(經典實現:Tomcat生命週期中的init,SpringIOC上層類載入具體子類指定的配置檔案)
- 觀察者模式(Observer):目標方法被呼叫,通知所有觀察者(經典實現:Tomcat生命週期事件監聽,Spring BeanPostProcessor實現 )
- 迭代子模式(Interator):提供一種方法順序訪問一個聚合物件中各個元素, 而又不需暴露該物件的內部表示。(經典實現:集合迭代器)
- 責任鏈模式(ChainOfResponsibility):鏈式依賴,依次呼叫(經典實現:Tomcat Valve)
- 命令模式(Commond):Action定義具體命令,攔截器Invocation回撥執行命令(經典實現:Struts2)
- 備忘錄模式(Memento):建立原始物件副本,用於儲存恢復原始物件資料
- 狀態模式(Stage):通過改變狀態,改變行為(經典實現:切換裝載著不同配置資訊的配置檔案物件)
- 訪問者模式(Visitor):結構與操作解耦。靈活的操作,放入固定的結構中執行(經典實現:在SpringAOP的實現過程中首先會有一個ProxyCreator去建立切入點,通知之類的,然後建立一個抽象工廠將這些引數物件傳遞給抽象工廠,抽象工廠呼叫createAopProxy(this)來建立物件,傳入不同的抽象工廠創建出不同的實體物件)
- 中介者模式(Mediator):MVC 框架,其中C(控制器)就是 M(模型)和 V(檢視)的中介者
- 直譯器模式(Iterpreter):定義分別定義 + - * / 非終結符,組合不同的非終結符定義不同的表示式,維護繁瑣
最近又看了一遍java23種設計模式,網上很多都說java有23種設計模式,但是總感覺不對,像攔截器,監聽器,過濾器,mvc難道不屬於設計模式嗎。這個問題沒多大意義,就不討論了。上次直接把這23種設計模式看完之後當時看小Demo貌似是理解了,但是怎麼也不能把23種全部背下來。最近又重新看了一遍,認真的體會了一下其中的思想。其實說這句話有些牽強了,現在的水平再怎麼認真也不能把設計模式的思想體會的淋漓盡致。這次與上次的不同是,幾乎不用看講解了,看程式碼全部能理解小Demo的工作原理。於是試著各用一句話來總結他們。無論是深入理解設計模式的大牛,還是沒看過設計模式的初學者。一定會有許多人看到我的總結不知所云。我只是試著按我的思路總結一下。好讓自己容易記憶。各位也同樣可以按自己的思路各寫一句話總結。
如果想快速瞭解一下設計模式推薦一篇部落格:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html。對的,是瞭解,不是研究。個人感覺設計模式並不是隨隨便便給你舉個現實中的例子就能夠學好的。即使例子再生動,想理解設計模式的精髓必須深入到程式碼中去。例如大多數框架開啟時用到的工廠模式;Tomcat中Pipeline中Valve的責任鏈模式呼叫;StandardBase中使用代理模式引入LifecycleSupport來增加自身對生命週期的管理能力;LifecycleListener中執行各個監聽器時的觀察者模式。
個人認為設計模式的學習非一朝一夕能成的東西。它是在自己做開發看原始碼的工程中慢慢體會出來的。寫個小案例,告訴你這叫XX模式,像這種帖子網上已經很多了,沒必要再重複了,之後在讀原始碼的工程中遇到好的應用一定會總結到部落格中的。
提供一個自己學習設計模式的思路:先看小Demo認識各種設計模式的樣子,之後在讀原始碼時再慢慢理解各種設計模式的好處。而且設計模式往往還不是單獨一個出現的,例如過濾器加攔截器能實現SpringAOP的功能。知識有限能舉的例子也不多,讀原始碼時注意這一點就行。
如果想看Demo可以在網上找,也可以在我github網址(https://github.com/smallbug-vip/repo)上獲取,其中大部分原始碼還是從上面部落格中直接拷貝的。