什么是模式
引用
《Java與模式》
模式化的過程就是把問題抽象化,在忽略掉不重要的細節(jié)后,發(fā)現(xiàn)問題的一般性本質(zhì),并找到普遍適用的解決方案的過程。簡而言之,人們在自己的環(huán)境中不斷發(fā)現(xiàn)問題的解決方案的時候,發(fā)現(xiàn)有一些問題及其解決方案不斷變換面孔出現(xiàn),但這些不同的面孔有著共同的本質(zhì),這些本質(zhì)就是模式。
coolshell.cn博主陳皓
在正式說明GoF的那23個經(jīng)典的設(shè)計模式其實和OO關(guān)系不大并和Unix的設(shè)計思想很相似的這個觀點之前,讓我先來說說什么是模式?設(shè)計模式的英 文是Design Pattern,模式是Pattern的漢譯。所謂Pattern就是一種規(guī)則,或是一種模型,或是一種習慣。
這么一來大千世界哪哪都模式了,就比如說Iphone自出現(xiàn)以后,各廠商紛紛效仿,那Iphone的用戶體驗也算是一種模式,當然喬布斯也算是一種模式了-雷布斯...X布斯。
背景
《設(shè)計模式》這本書由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。這幾位作者常被稱為“四人組(Gang of Four)”,而模式的概念被引入軟件設(shè)計界的時間還要在1995年之前。
1987年,Ward Cunningham 和 Kent Beck 在一起用Smalltalk 做設(shè)計用戶界面的工作。他們決定使用Alexander的理論發(fā)展出一個有五個模式的語言來指導Smalltak新,因此他們寫了一篇文章"Useing Pattern Languages for Object-Oriented Programs(使用模式語言做面向?qū)ο蟪绦?"的論文(發(fā)表于 OOPSLA'87 in Orlando)。
在這之后,Jim Coplien 開始搜集C++語言的成例(idioms),這些成例發(fā)表在1991年出版的《高級c++編程風格與成例》一書中。
從1990年到1992年,“四人幫”成員開始搜集模式的工作。關(guān)于模式的討論和工作會議則一再舉行。
在1993年8月,Kent Beck和Grady Booch主持了在科羅拉多的山區(qū)度假村召開的第一次關(guān)于模式的會議。模式研究的主要人物都參加了這些會議。包括 Jim coplien,Doug Lea,Desmond D'souze,Norm kerth,Wolfgang Pree等。
在那之后不久,“四人幫”的書就出來了。
之后研究模式的人數(shù)越來越多,編程模式語言大會(PLOP),每年一次定期在美國舉行,并把會議中的內(nèi)容匯總成書。
這么多牛人,亮瞎了我的眼啊。
題外話:這里也有一個2008年的視頻,Jim coplien和Robert C. Martin就TDD的辯論,Jim coplien反對TDD,而Robert C. Martin支持TDD。
Robert C. Martin就是下面SOLID原則的提出者。
模式的好處
- 可維護性
- 可復用性
Rober C.Martin 指出,導致一個軟件設(shè)計的可維護性較低,也就是說會隨著性能要求變化而“腐爛”的真正原因有四個:過于僵硬,過于脆弱,復用率低,黏度過高。
- 過于僵硬
加入一個新功能,不僅僅意味著添加一個獨立的模塊,而且因為這個新功能的添加會波及其它存在的模塊。 - 過于脆弱
對一個地方修改,會導致看上去與這個地方無關(guān)的其它地方發(fā)生故障。 - 黏度過高
有的時候一個改動可以以保存原始設(shè)計意圖和原始設(shè)計框架的方式進行,也可以以破壞原始意思和框架的方式進行。第一種會對系統(tǒng)的未來有利,第二種是權(quán)宜之計,可以在短時間內(nèi)解決問題,但是會犧牲中長期的利益。 - 復用率低
所謂復用,就是一個軟件的組成部分,可以在同一個項目的不同地方甚至是不同項目中重復使用。
每當程序員發(fā)現(xiàn)一段代碼、函數(shù)、模塊所做的事情是可以在新的模塊、或者新系統(tǒng)中使用的時候,他們問題發(fā)現(xiàn),這些代碼依賴了一大堆其它東西,以至于很難將他們分開。最后,他們發(fā)現(xiàn)最好的辦法就是不是“碰”這些已有的東西,而是重新寫自己的代碼。他們可能會用源代碼剪貼的辦法,以最原始的復用方式,節(jié)省一點時間。這樣的系統(tǒng)就是復用率低的系統(tǒng)。
前三點說的是維護性,后一點說的是復用性,所以一個系統(tǒng)的好壞是可以從這兩個大方向進行判斷的,這也是設(shè)計模式想做做到的。
S.O.L.I.D原則
簡介
Solid原意是"固定的,可靠的",可見原則之重要啊。呵呵 。由Robert C. Martin提出,不知道為什么大家都叫他Rob大叔。
資料
S.O.L.I.D.類設(shè)計原則
面向?qū)ο笤O(shè)計的SOLID原則
內(nèi)容
- SRP The Single Responsibility Principle 單一責任原則
- OCP The Open Closed Principle 開放封閉原則
- LSP The Liskov Substitution Principle 里氏替換原則
- DIP The Dependency Inversion Principle 依賴倒置原則
- ISP The Interface Segregation Principle 接口分離原則
除了以上還有一些其它原則一塊寫上
- 迪米特
- 合成,聚合原則(Favor Composition Over Inheritance)
- 高內(nèi)聚,低耦合
分類
創(chuàng)建模式
工廠,單例,多例,建造,原始模型
結(jié)構(gòu)模式
適配器,缺省適配,合成,裝飾,代理,亨元,門面,橋梁
行為模式
不變,策略,模版方法,觀察者,迭代子,責任鏈,命令,備忘錄,狀態(tài),訪問者,解釋器,調(diào)停者
模式
工廠模式
- 簡單工廠(靜態(tài)工廠)
- 工廠方法(多態(tài)性工廠)
- 抽象工廠
產(chǎn)品層級,產(chǎn)品族。經(jīng)典的unix,window不同的窗口展示。
Prototype模式,原型模式
- 變量,對象以及對象的引用
- 深復制和淺復制
- ==和equail
- 克隆滿足的條件
- x.clone()!=x
- x.clone().getClass()==x.getClass()
- x.clone().equails(x)
- 簡單原形和注冊原形(對象池)
- clone()方法 和 Cloneable接口
- 原型和串行化
適配器模式
- 類適配,對象適配
- JDBC/ODBC橋梁
- WINE
橋梁模式
定義: 將抽象化與具體化解耦。
- AWT的Peer架構(gòu)
- 驅(qū)動器與JDBC驅(qū)動器
裝飾模式
定義:以客戶端透明的方式擴展模式的功能。
代理模式
定義:給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。
裝飾模式
定義
又名包裝,以對客戶端透明的方式擴展對象的功能。是繼承關(guān)系的一種替代方案。
在什么時間使用?
- 需要擴展一個類的功能
- 需要動態(tài)地給一個對象增加功能,這些功能又可以動態(tài)的撤銷
- 需要增加由一些基本功能 的排列組合而產(chǎn)生的非常大量的功能,而使繼承關(guān)系變得不現(xiàn)實。
責任鏈模式
在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成的一條鏈。請求在這個鏈上的某一個對象決定處理此請求。發(fā)出請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的同時能重新組織鏈和分配責任。
命令模式
把一個請求或一個操作封裝到一個對象中。命令模式允許使用不同的請求把客戶端參數(shù)化,對請求排隊或記錄請求日志,可以提供命令的撤銷和恢復功能。
觀察者模式
又叫發(fā)布-訂閱模式,模型-試圖模式(Model/View)模式,源-監(jiān)聽器(source-listener)模式或從屬者模式。
觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者同時監(jiān)聽謀一個主題對象,這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自己更新自己。
Android中的廣播組件其實就是一種觀察者模式。
最終
你只需要做到也只有能做過以下三點時你的代碼和系統(tǒng)才算是好的。
- 簡單(單一,簡潔)
- 模塊
- 拼裝
參考
《Java與模式》
從面向?qū)ο蟮脑O(shè)計模式看軟件設(shè)計