1. 程式人生 > >“設計模式”學習總結

“設計模式”學習總結

【學習總結】

學習的效果很多時候依賴於自身的一個學習“態度”。以自己為例子,我是一個不斷追求自我認知的人,因為我渴望對自己人生的“主動性”,我喜歡這種感覺。所以,我需要掌握各種“思維模式”來增加對自我的理性認知,從而提高自己更加“主動”的可能性。帶著這樣一個心態去學習,我就很容易“入戲”,並不會感到厭倦,而且持續在自己身上學以致用。“設計模式”本身就是一種思維模式,在設計領域它還是我們在相互分享交流的一種共通規範性語言,在我們相互分享理念的時候起了很大的作用,例如在開源的程式碼上使用這種“共性規範”更容易讓大家對這種抽象思維的理解,大大降低了程式碼之間的溝通成本。

【學習建議】

越高階,越抽象;越抽象,越基礎;越基礎,越忽視;越忽視,越浮躁......強烈建議自己系統性地結合實踐(Java設計實踐)親自行動看一遍,寫一遍,畫一遍。

“建立型”設計模式

 1、單例模式(Singleton) 

 

【模式定義】

確保一個類只有一個例項,並提供一個全域性訪問點。

【案例場景】

● java.lang.Runtime#getRuntime()

 

2、構建模式(Builder) 

 

【模式定義】

主要用來簡化一個複雜的物件的建立。

【案例場景】

● java.lang.StringBuilder#append()

● java.lang.StringBuffer#append()

● java.sql.PreparedStatement

 

3、原型模式(Prototype) 

【模式定義】

當建立給定類的例項的過程很昂貴或很複雜時,就使用原型模式。

【案例場景】

● java.lang.Object#clone()

● java.lang.Cloneable

 

4、抽象工廠模式(Abstract Factory) 

【模式定義】

提供一個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。

【案例場景】

● java.util.Calendar#getInstance()

● java.sql.DriverManager#getConnection()

● java.sql.Connection#createStatement()

● java.text.NumberFormat#getInstance()

 

5、工廠方法模式(Factory Method) 

【模式定義】

定義了一個建立物件介面,但由子類決定例項化的類是哪一個,工廠方法讓類把例項化推遲到子類。

【案例場景】

● java.lang.Proxy#newProxyInstance()

● java.lang.reflect.Array#newInstance()

● java.lang.reflect.Constructor#newInstance()

● java.lang.Class#forName()

 

“行為型”設計模式

1、策略模式(Strategy) 

【模式定義】

定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。

【案例場景】

● java.util.Comparator#compare()

● javax.servlet.http.HttpServlet

● javax.servlet.Filter#doFilter()

 

2、狀態模式(State) 

【模式定義】

允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。

【案例場景】

● java.util.Iterator

 

3、命令模式(Command) 

【模式定義】

將“請求”封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。命令模式也支援可撤銷的操作。

【案例場景】

● java.lang.Runnable

 

4、觀察者模式(Observer) 

【模式定義】

定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新。

【案例場景】

● java.util.EventListener

● javax.servlet.http.HttpSessionAttributeListener

 

5、迭代器模式(Iterator) 

【模式定義】

提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。

【案例場景】

● java.util.Iterator

● java.util.Enumeration

 

6、模板方法模式(Template Method) 

【模式定義】

在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

【案例場景】

● java.util.Collections#sort()

● java.io.InputStream#read()

 

7、訪問者模式(Visitor) 

【模式定義】

當你想要為一個物件的組合增加新的能力,且封裝並不重要時,就使用訪問者模式,主要意圖是將資料結構與資料操作分離。

【案例場景】

● javax.lang.model.element.Element & javax.lang.model.element.ElementVisitor

● javax.lang.model.type.TypeMirror & javax.lang.model.type.TypeVisitor

 

8、中介者模式(Mediator) 

【模式定義】

使用中介者模式來集中相關物件之間複雜的溝通和控制方式。

【案例場景】

● java.util.Timer

● java.util.concurrent.Executor#execute()

 

9、責任鏈模式(Chain of Responsibility) 

【模式定義】

當你想要讓一個以上的物件有機會能夠處理某個請求的時候,就使用責任鏈模式。

【案例場景】

● java.util.logging.Logger#log()

● javax.servlet.Filter#doFilter()

 

 10、直譯器模式(Interpreter) 

 

【模式定義】

使用直譯器模式為語言建立直譯器。

【案例場景】

● java.util.Pattern

● java.text.Format

 

 11、備忘錄模式(Memento) 

 

【模式定義】

當你需要讓物件返回之前的狀態時,(例如,你的使用者請求“撤銷”),就使用備忘錄模式。

【案例場景】

● java.util.Date

● java.io.Serializable

 

 “結構型”設計模式

 1、裝飾者模式(Decorator) 

【模式定義】

動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

【案例場景】

● java.io.BufferedInputStream(InputStream)

● java.io.DataInputStream(InputStream)

● java.io.BufferedOutputStream(OutputStream)

 

2、外觀模式(Facade) 

【模式定義】

用一個簡單的介面包狀一組元件,介面,抽象或是子系統。

【案例場景】

● java.lang.Class

● javax.faces.webapp.FacesServlet

 

 3、介面卡模式(Adapter) 

 

【模式定義】

將一個類的介面,轉換成客戶期望的另一個介面,介面卡讓原本介面不相容的類可以合作無間。

【案例場景】

● java.util.Arrays#asList()

● java.io.InputStreamReader(InputStream)

● java.io.OutputStreamWriter(OutputStream)

 

 4、代理模式(Proxy) 

 

【模式定義】

為另一個物件提供一個替身或佔位符以控制對這個物件的訪問。

【案例場景】

● java.lang.reflect.Proxy

● RMI

 

 5、組合模式(Composite) 

 

【模式定義】

允許你將物件組合成樹形結構來表現“整體/部分”層次結構,組合能讓客戶以一致的方式處理個別對象以及物件組合。

【案例場景】

● java.util.Map#putAll(Map)

● java.util.List#addAll(Collection)

● java.util.Set#addAll(Collection)

 

 6、橋接模式(Bridge) 

 

【模式定義】

使用橋接模式不只改變你的實現,也改變你的抽閒。

【案例場景】

● JDBC

 

 7、蠅量模式(Flyweight) 

 

【模式定義】

有效率地儲存大量的小的物件。

【案例場景】

● java.lang.Integer#valueOf(int)

● java.lang.Boolean#valueOf(boolean)

● java.lang.Byte#valueOf(byte)

● java.lang.Character#valueOf(char)