“設計模式”學習總結
【學習總結】
學習的效果很多時候依賴於自身的一個學習“態度”。以自己為例子,我是一個不斷追求自我認知的人,因為我渴望對自己人生的“主動性”,我喜歡這種感覺。所以,我需要掌握各種“思維模式”來增加對自我的理性認知,從而提高自己更加“主動”的可能性。帶著這樣一個心態去學習,我就很容易“入戲”,並不會感到厭倦,而且持續在自己身上學以致用。“設計模式”本身就是一種思維模式,在設計領域它還是我們在相互分享交流的一種共通規範性語言,在我們相互分享理念的時候起了很大的作用,例如在開源的程式碼上使用這種“共性規範”更容易讓大家對這種抽象思維的理解,大大降低了程式碼之間的溝通成本。
【學習建議】
越高階,越抽象;越抽象,越基礎;越基礎,越忽視;越忽視,越浮躁......強烈建議自己系統性地結合實踐(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)