設計基礎-常用的設計模式雜記
計算機工程師做的工作某個方面和建築師差不多,尤其是做專案的時候。
既然是做專案,必然要考慮投入產出,所以產生了軟體工程的學科。軟體工程告訴我們如何控制專案,包括可行性到維護等方方面面的管理過程。
不過大部分的工程師並不關心那個,他們更多是思考如何技術上實現。
但是設計師必須意識到不同的方法會帶來不同的投入產出,所以有人根據前人的經驗做了總結,搞出了兩個東西:
1.設計原則 (指導性要求)
2.設計模式(設計套路)
後者主要是為了滿足前者而存在的。
有了這兩個東西,就可以較好地配合專案經理,對專案進行管控--主要實現進度和成功控制。
不過在開始正式闡述之前,我需要說說另外一個很重要的內容:開發規範。
我們把眼界放開一點,就會發現其實前文提到的兩個內容,不外乎人們的經驗:無規矩不成方圓。
某些微小團體可能並不怎麼關注這個,但是有個事情還是強烈建議先完成:定義屬於自己團隊的開發規範,讓程式碼看起來整齊劃一。
這個也可以算是某種程度的原則和模式的統一規範。
但我還是強烈建議團隊的成員必須掌握這些基本的東西。畢竟大部分人都是普通得不能再普通的個體,沒有天縱之才,沒有發明新的工具之前,就不要妄想無招勝有招了。
在工作的時候,最煩的就是沒有規範導致的一些問題,以及專案維護的時候,看一些亂起八糟的程式碼。
閒話少敘,本人由於工作需要,也簡單地瀏覽了下有關設計模式的東西,發現的確是有可用之處。
這些資料主要來自於
這些資料整體還是很完善,而且通俗易懂。建議可以在這裡學習,以便減少不必要的支出。
菜鳥網整理的設計模式挺多的。但實際工作的時候,大部分用不著,這和大家一個道理,好用的常用的就幾招。一些非常個性化的就只能使用於一些非常特殊的場景。
由於菜鳥網有詳細的資料,這裡就不一一重複了。下面只列出本人比較關注的一些內容
名稱 介紹主要解決 優點缺點(代價)使用場景例子名稱 介紹主要解決 優點缺點(代價)使用場景例子:名稱 | 介紹 | 主要解決 | 優點 | 缺點(代價) | 使用場景 | 例子 |
---|---|---|---|---|---|---|
單例 |
這種模式涉及到一個單一的類,該類負責建立自己的物件, 同時確保只有單個物件被建立。 這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件 |
一個全域性使用的類頻繁地建立與銷燬 |
在記憶體裡只有一個例項,減少了記憶體的開銷, 尤其是頻繁的建立和銷燬例項(比如管理學院首頁頁面快取) 避免對資源的多重佔用(比如寫檔案操作) |
沒有介面,不能繼承,與單一職責原則衝突, 一個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化 |
不需要屬性 或者是屬性必須保持唯一的時候 |
|
工廠 |
在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯, 並且是通過使用一個共同的介面來指向新建立的物件 |
介面選擇 簡化各個需要建立類似物件的程式碼的編寫 |
1、一個呼叫者想建立一個物件,只要知道其名稱就可以了。 2、擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。 3、遮蔽產品的具體實現,呼叫者只關心產品的介面 |
要維護工廠 |
有許多類似的類要建立, 簡化客戶端程式碼 |
|
代理 | 建立具有現有物件的物件,以便向外界提供功能介面 | 比如物件建立開銷很大,或者某些操作需要安全控制,或者需要程序外的訪問 |
按職責來劃分,通常有以下使用場景: 1、遠端代理。 2、虛擬代理。 3、Copy-on-Write 代理。 4、保護(Protect or Access)代理。 5、Cache代理。 6、防火牆(Firewall)代理。 7、同步化(Synchronization)代理。 8、智慧引用(Smart Reference)代理 |
|||
介面卡 (轉換器) |
轉換一個現存物件的功能以便滿足另外一些要求 |
主要解決在軟體系統中,常常要將一些"現存的物件"放到新的環境中,而新環境要求的介面是現物件不能滿足的。 重用現有功能 |
||||
裝飾 | 建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能 |
重用現有類;增加一些功能。 (某種程度上優點象代理) |
||||
觀察者 | 當物件間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個物件被修改時,則會自動通知依賴它的物件。觀察者模式屬於行為型模式 | 一個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作 |
1、如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標之間有迴圈依賴的話, 觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰。 3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化 |
|||
模板 | 一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式(實際就是物件繼承) | 一些方法通用,卻在每一個子類都重新寫了這一方法 |
如果我們認真看下已有的模式,會發現有些還是基本不用的,這些不需要刻意去理解,只需要記住有這個東西,在需要的時候,可以回來研究下。
如果您的團隊主要是做一些常規的應用開發,其實不需要過分關注設計模式(雖然有的已經不自覺地使用了),因為大部分的此類應用用不著動太多的腦筋,大體簡單地複製貼上就差不多了。
話雖如此,有備無患總是好的!