設(shè)計模式

什么是模式


引用
《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 CunninghamKent 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è)計

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 4,094評論 1 15
  • 一、設(shè)計模式的分類 總體來說設(shè)計模式分為三大類: 創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者...
    RamboLI閱讀 833評論 0 1
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨雜貨鋪閱讀 1,639評論 0 3
  • 面向?qū)ο笤O(shè)計的五大原則 單一職責原則(SRP) 一個類應該僅有一個職責。 開放封閉原則(OCP) 對擴展開放,...
    LiuHDme閱讀 1,575評論 0 3
  • 設(shè)計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數(shù)等等)應該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,081評論 3 14

友情鏈接更多精彩內(nèi)容