十一宅了,也沒學習看啥書,所有時間花在了圍棋上,雖然很頹廢,不過令人欣慰的是居然升了3級,現在是6k水平,之前晚上下的多,停在9k挺長時間的,居然在10.1突破了,這麼看來我能升段的目標還是可能實現的,這麼看自信還真是挺重要的,而我一直不算個自信的人,本來打算10.1假期完成這個設計模式總結的,但是 ...
十一宅了,也沒學習看啥書,所有時間花在了圍棋上,雖然很頹廢,不過令人欣慰的是居然升了3級,現在是6k水平,
之前晚上下的多,停在9k挺長時間的,居然在10.1突破了,這麼看來我能升段的目標還是可能實現的,這麼看自信還真是挺重要的,而我一直不算個自信的人,
本來打算10.1假期完成這個設計模式總結的,但是懶癌爆發,就拖到今天啦。
設計模式的6大原則
這也是個老生常談的問題,我也不免俗
1.單一職責原則
一個類只承擔一個職責
2.開放-封閉原則
對擴展開放,對修改關閉,即儘量以擴展的方式來維護系統
3.里氏替換原則
表示我們可以在代碼中使用任意子類來替代父類並且程式不受影響,這樣可以保證我們使用“繼承”並沒有破壞父類
4.介面隔離原則
客戶端不應該依賴於它不需要的介面,兩個類之間的依賴應該建立在最小介面的基礎上。這條原則的目的是為了讓那些使用相同介面的類只需要實現特定必要的一組方法,而不是大量沒用的方法專而小的介面,而不是總介面
5.依賴倒置原則
抽象不依賴於細節,而細節應該依賴於抽象。提倡“面向介面”編程,而非“面向實現”編程
6.迪米特法則
用設計行話就是“高內聚,低耦合”,減少類之間的相互依賴,修改系統的某一部分的時候,不會影響到其他部分,使系統有更好的維護性
設計模式分類
創建型:
單例:保證一個類只有一個實例,其中jdk中枚舉(Enum)類是單例。
簡單工廠:靜態工廠方法,根據傳遞參數的不同,返回不同的實例。
工廠方法:定義創建對象的介面,讓子類去決定具體使用哪個類。
Collection.iterator()
java.lang.Proxy#newProxyInstance()
java.lang.Object#toString()
java.lang.Class#newInstance()
java.lang.reflect.Array#newInstance()
java.lang.reflect.Constructor#newInstance()
java.lang.Boolean#valueOf(String)
java.lang.Class#forName()
抽象工廠:提供一個創建一系列相關的對象的介面,而無須指定它的具體實現類
jdk中 java.sql.*
原型:用原型實例指定創建對象的種類,並通過複製原型實例得到對象
jdk中 java.lang.Object#clone(),java.lang.Cloneable
建造者:簡化複雜對象的創建,將複雜對象的構造與表示相分離,使得同樣的構造過程可以產生不同的複雜對象
jdk中 java.sql.PreparedStatement
結構型:
適配器:將一個類的介面轉換成用戶希望的另一個介面
jdk中 java.io.OutputStreamWriter(OutputStream),java.util.Arrays#asList()
橋接:將抽象部分與實現部分分離,從而使得它們可以獨立變化,使各部分組件化
jdk中的JDBC
組合:將對象組裝成樹狀結構以表示“部分-整體”的關係
java.util.Map#putAll(Map),java.util.List#addAll(Collection)
裝飾:動態的為對象添加額外職責
jdk中IO包
外觀:為系統的一組介面提供一個一致的界面,使外觀一致
jdk中java.lang.Class
享元:它使用共用物件,用來儘可能減少記憶體使用量以及分享資訊給儘可能多的相似物件
jdk中 java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
代理:為其他對象提供一種代理以控制對該對象的訪問
jdk中 java.lang.reflect.Proxy
java.rmi.*
行為型:
責任鏈:實施一系列的操作,並且使調用雙方和操作之間有耦合關係
jdk中 java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
命令:對一個客戶端請求封裝成抽象對象
jdk中 java.lang.Runnable
javax.swing.Action
解釋器:一種按照規定語法進行解析的方案
jdk中 java.util.Pattern
java.text.Format
迭代器:順序訪問集合中的所有元素
jdk中 java.util.Iterator
中介:用一個中介者對象封裝一系列的對象交互
jdk中 java.lang.reflect.Method#invoke()
備忘:備份或者恢複復雜對象的狀態
jdk中 java.io.Serializable
觀察者:當一個對象發生改變時,所有和它有依賴關係的對象都會得到通知
jdk中 java.util.Observer/java.util.Observable
java.util.EventListener
狀態:類的行為是基於它的狀態改變
jdk中 java.util.Iterator
策略:定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換
jdk中java.util.Comparator#compare()
模板:定義一個操作流程的方法骨架,具體細節的實現放到子類中
jdk中java.io.InputStream, java.io.OutputStream, java.io.Reader和java.io.Writer的所有非抽象方法
java.util.AbstractList, java.util.AbstractSet和java.util.AbstractMap的所有非抽象方法
javax.servlet.http.HttpServlet#doXXX()
java.util.Collections#sort()
訪問者:作用於某個對象群中各個對象的操作. 它可以使你在不改變這些對象本身的情況下,定義作用於這些對象的新操作
jdk中javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor 設計模式寫到這裡算告一段落啦,雖然我看過幾遍,並且參考這種博客書籍寫下了這些篇內容,但是問自己這些模式就真的懂啦嘛,我可以肯定的說不是的,像其中解釋器訪問者都是什麼鬼,我依然很難解釋清楚,還是用的少,或者都是封裝完整的,很少需要自己去封裝這麼多的模式,這種思想的種子算埋下啦,至於開不開花真的靠悟性啦,我至今還未開悟...
系列博文參考博客及書籍在此一併列出:
博客:http://blog.csdn.net/lovelion/article/details/17517213
書:研磨設計模式
博客:http://www.cnblogs.com/zuoxiaolong/category/509144.html
博客:http://www.iteye.com/news/18725
等等...