【學(xué)習(xí)總結(jié)】
學(xué)習(xí)的效果很多時候依賴于自身的一個學(xué)習(xí)“態(tài)度”礁阁。以自己為例子靠欢,我是一個不斷追求自我認(rèn)知的人薪缆,因?yàn)槲铱释麑ψ约喝松摹爸鲃有浴保蚁矚g這種感覺沧侥。所以,我需要掌握各種“思維模式”來增加對自我的理性認(rèn)知宴杀,從而提高自己更加“主動”的可能性癣朗。帶著這樣一個心態(tài)去學(xué)習(xí),我就很容易“入戲”旺罢,并不會感到厭倦旷余,而且持續(xù)在自己身上學(xué)以致用绢记。“設(shè)計(jì)模式”本身就是一種思維模式正卧,在設(shè)計(jì)領(lǐng)域它還是我們在相互分享交流的一種共通規(guī)范性語言蠢熄,在我們相互分享理念的時候起了很大的作用,例如在開源的代碼上使用這種“共性規(guī)范”更容易讓大家對這種抽象思維的理解穗酥,大大降低了代碼之間的溝通成本护赊。
【學(xué)習(xí)建議】
越高級,越抽象砾跃;越抽象,越基礎(chǔ)节吮;越基礎(chǔ)抽高,越忽視;越忽視透绩,越浮躁......強(qiáng)烈建議自己系統(tǒng)性地結(jié)合實(shí)踐(Java設(shè)計(jì)實(shí)踐)親自行動看一遍翘骂,寫一遍,畫一遍帚豪。
“創(chuàng)建型”設(shè)計(jì)模式
1碳竟、單例模式(Singleton)?
【模式定義】
確保一個類只有一個實(shí)例颓鲜,并提供一個全局訪問點(diǎn)腋么。
【案例場景】
● java.lang.Runtime#getRuntime()
2、構(gòu)建模式(Builder)?
【模式定義】
主要用來簡化一個復(fù)雜的對象的創(chuàng)建尼荆。
【案例場景】
● java.lang.StringBuilder#append()
●?java.lang.StringBuffer#append()
●?java.sql.PreparedStatement
3烛亦、原型模式(Prototype)?
【模式定義】
當(dāng)創(chuàng)建給定類的實(shí)例的過程很昂貴或很復(fù)雜時诈泼,就使用原型模式。
【案例場景】
●?java.lang.Object#clone()
●?java.lang.Cloneable
4煤禽、抽象工廠模式(Abstract Factory)?
【模式定義】
提供一個接口铐达,用于創(chuàng)建相關(guān)或依賴對象的家族,而不需要明確指定具體類檬果。
【案例場景】
●?java.util.Calendar#getInstance()
●?java.sql.DriverManager#getConnection()
●?java.sql.Connection#createStatement()
●?java.text.NumberFormat#getInstance()
5瓮孙、工廠方法模式(Factory Method)?
【模式定義】
定義了一個創(chuàng)建對象接口,但由子類決定實(shí)例化的類是哪一個选脊,工廠方法讓類把實(shí)例化推遲到子類杭抠。
【案例場景】
●?java.lang.Proxy#newProxyInstance()
●?java.lang.reflect.Array#newInstance()
●?java.lang.reflect.Constructor#newInstance()
●?java.lang.Class#forName()
“行為型”設(shè)計(jì)模式
1、策略模式(Strategy)?
【模式定義】
定義了算法族知牌,分別封裝起來祈争,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶角寸。
【案例場景】
●?java.util.Comparator#compare()
●?javax.servlet.http.HttpServlet
●?javax.servlet.Filter#doFilter()
2菩混、狀態(tài)模式(State)?
【模式定義】
允許對象在內(nèi)部狀態(tài)改變時改變它的行為忿墅,對象看起來好像修改了它的類。
【案例場景】
●?java.util.Iterator
3沮峡、命令模式(Command)?
【模式定義】
將“請求”封裝成對象疚脐,以便使用不同的請求、隊(duì)列或者日志來參數(shù)化其他對象邢疙。命令模式也支持可撤銷的操作棍弄。
【案例場景】
●?java.lang.Runnable
4、觀察者模式(Observer)?
【模式定義】
定義了對象之間的一對多依賴疟游,這樣一來呼畸,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并自動更新颁虐。
【案例場景】
●?java.util.EventListener
●?javax.servlet.http.HttpSessionAttributeListener
5蛮原、迭代器模式(Iterator)?
【模式定義】
提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內(nèi)部的表示另绩。
【案例場景】
●?java.util.Iterator
●?java.util.Enumeration
6儒陨、模板方法模式(Template Method)?
【模式定義】
在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中笋籽。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下蹦漠,重新定義算法中的某些步驟。
【案例場景】
●?java.util.Collections#sort()
●?java.io.InputStream#read()
7车海、訪問者模式(Visitor)?
【模式定義】
當(dāng)你想要為一個對象的組合增加新的能力笛园,且封裝并不重要時,就使用訪問者模式容劳,主要意圖是將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離喘沿。
【案例場景】
●?javax.lang.model.element.Element & javax.lang.model.element.ElementVisitor
●?javax.lang.model.type.TypeMirror & javax.lang.model.type.TypeVisitor
8、中介者模式(Mediator)?
【模式定義】
使用中介者模式來集中相關(guān)對象之間復(fù)雜的溝通和控制方式竭贩。
【案例場景】
●?java.util.Timer
●?java.util.concurrent.Executor#execute()
9蚜印、責(zé)任鏈模式(Chain of Responsibility)?
【模式定義】
當(dāng)你想要讓一個以上的對象有機(jī)會能夠處理某個請求的時候,就使用責(zé)任鏈模式留量。
【案例場景】
●?java.util.logging.Logger#log()
●?javax.servlet.Filter#doFilter()
10窄赋、解釋器模式(Interpreter)?
【模式定義】
使用解釋器模式為語言創(chuàng)建解釋器。
【案例場景】
●?java.util.Pattern
●?java.text.Format
11楼熄、備忘錄模式(Memento)?
【模式定義】
當(dāng)你需要讓對象返回之前的狀態(tài)時忆绰,(例如,你的用戶請求“撤銷”)可岂,就使用備忘錄模式错敢。
【案例場景】
●?java.util.Date
●?java.io.Serializable
“結(jié)構(gòu)型”設(shè)計(jì)模式
1、裝飾者模式(Decorator)?
【模式定義】
動態(tài)地將責(zé)任附加到對象上,若要擴(kuò)展功能稚茅,裝飾者提供了比繼承更有彈性的替代方案纸淮。
【案例場景】
●?java.io.BufferedInputStream(InputStream)
●?java.io.DataInputStream(InputStream)
●?java.io.BufferedOutputStream(OutputStream)
2、外觀模式(Facade)?
【模式定義】
用一個簡單的接口包狀一組組件亚享,接口咽块,抽象或是子系統(tǒng)。
【案例場景】
●?java.lang.Class
●?javax.faces.webapp.FacesServlet
3欺税、適配器模式(Adapter)?
【模式定義】
將一個類的接口侈沪,轉(zhuǎn)換成客戶期望的另一個接口,適配器讓原本接口不兼容的類可以合作無間晚凿。
【案例場景】
●?java.util.Arrays#asList()
●?java.io.InputStreamReader(InputStream)
●?java.io.OutputStreamWriter(OutputStream)
4亭罪、代理模式(Proxy)?
【模式定義】
為另一個對象提供一個替身或占位符以控制對這個對象的訪問。
【案例場景】
●?java.lang.reflect.Proxy
●?RMI
5歼秽、組合模式(Composite)?
【模式定義】
允許你將對象組合成樹形結(jié)構(gòu)來表現(xiàn)“整體/部分”層次結(jié)構(gòu)皆撩,組合能讓客戶以一致的方式處理個別對象以及對象組合。
【案例場景】
●?java.util.Map#putAll(Map)
●?java.util.List#addAll(Collection)
●?java.util.Set#addAll(Collection)
6哲银、橋接模式(Bridge)?
【模式定義】
使用橋接模式不只改變你的實(shí)現(xiàn),也改變你的抽閑呻惕。
【案例場景】
● JDBC
7荆责、蠅量模式(Flyweight)?
【模式定義】
有效率地存儲大量的小的對象。
【案例場景】
● java.lang.Integer#valueOf(int)
●?java.lang.Boolean#valueOf(boolean)
●?java.lang.Byte#valueOf(byte)
●?java.lang.Character#valueOf(char)