設計模式不是銀彈,不能解決所有問題,不要拿著錘子找釘子。1、工廠方法,隱藏了構建的複雜邏輯,將相似的一些物件的構造放到一起。
2、抽象工廠是工廠方法的變體,抽象層次更高的工廠方法。家具工廠 -> 各種風格的家具工廠
3、生成器(builder)用於解決建構函式太複雜的情況,建構函式的引數多就會很難使用(例如grpc的server builder),解決了重疊建構函式的問題。並且用director這樣乙個角色來指導builder的做法。
4、原型模式用於複製比較複雜的物件,通常是值複製
5、單例:單例很像乙個全域性變數,但是是延遲建立,第一呼叫才會構造。
1、介面卡,將乙份資料、物件適配到乙個不方便修改的介面上去,比如充電器轉化器。
2、裝飾器模式,能夠方便的裝飾/修飾乙個基礎功能,notify裝飾成qqnotify,再裝飾成為wechatnotify。如傳送基礎的資料裝飾成壓縮的資料,再裝飾成壓縮地、加密地資料。
3、**模式,構建客戶端**,比如快取客戶端的請求,直接獲取值,和裝飾器比較像,裝飾器是使得功能更加強大,**模式是限制訪問。
4、橋接模式,讓gui能在linux和windows上不同實現
5、外觀模式(facade),將複雜的多個子系統的介面實現簡單話,我覺得很像工廠方法。比如函式簽名convert(filename, format),format提供不同的格式呼叫不同的子系統。
6、組合模式(composite),樹狀節點可以用組合模式,組合模式是箱子和各種小物件的組合,通過總的盒子像所有的小物件發布操作。
7、享元模式,將物件的變數分割成為內在狀態和外在狀態,內在狀態是指物件中可以重複使用的,外在狀態是指物件各自不同的成員變數。通常搭配工廠方法使用,工廠方法儲存共享的池子。
1、責任鏈模式,讓請求、資料沿著責任鏈傳遞,處理。和裝飾器很像,但是責任鏈能夠中斷行為,裝飾器最終會走到底。比如多級認證可以用責任鏈,而資料轉換用裝飾器。
2、命令模式,將多種執行介面抽象成命令,比如乙個視窗的各種按鈕,按鈕可以抽象成為儲存命令、取消命令、渲染命令等。
3、迭代器模式,隱藏了內部的資料結構實現細節,比如stl的迭代器
4、中介模式,多個複雜的同級的類需要在一起協作時,這些複雜類的相互呼叫。
5、備忘錄模式,快照由對應需要產生快照的類產生,並且交由乙個負責人類進行壓棧儲存,並且負責人類沒有許可權訪問這個快照類。
6、觀察者模式,訂閱、發布的乙個處理邏輯,解決客戶不斷檢查和服務端廣播的問題。
7、狀態模式,和有限狀態機關聯,但是狀態的實現通常是條件語句實現,如果邏輯變得複雜,那就會獲得乙個及其膨脹的if/else/switch語句。如果邏輯複雜並且重複**多的話可以考慮每個類實現乙個狀態,在不同狀態下的相同行為產生不同的動作。比如文章的草稿狀態是可以反覆編輯的,但是到了發布狀態後就應該收回部分編輯許可權。
8、策略模式,定義一系列演算法, 並將每種演算法分別放入獨立的類中, 以使演算法的物件能夠相互替換。給定乙個context,設定不同的策略,執行相同的函式,執行不同的演算法。
9、模板模式,在基類中定義乙個過程,由子類實現過程。可以將重複方法都提取出來。
10、訪問者模式,原本由各個實體物件提供的資料,改由visitor來獲取,這樣不會侵入對應的實體物件。
設計模式這麼多,什麼時候使用呢?如果碰到乙個場景就想著使用設計模式,肯定是不對的,只有在特定場景下才能發揮作用。
1、全域性配置類與單例,通常程式為了支援靈活配置,會需要乙份動態配置檔案來實現多種行為,這種情況下,全域性配置類應該是個單例,能在全域性訪問到,並且不需要隨著函式的引數傳遞到最深處。
2、物件池的實現通常會和工廠方法一起使用,利用 objectfactory::create() 來統一建立物件,而不是在**的任意一處 new 物件。
設計模式筆記
1 類繼承與介面繼承的比較。物件的類與物件的型別的比較 乙個物件的類定義了物件怎麼樣實現的,同時也定義物件內部狀態和操作的實現。但是物件的型別只與他的介面有關,藉口即物件能響應的請求的集合。乙個物件可以有多個型別,不同的類物件可以有相同的型別。理解類繼承和介面繼承之間的差別也十分重要。類繼承根據乙個...
設計模式筆記
設計模式是一種真理,我們在沒有學習過設計模式時都會或多或少的與他不謀而合,但是學習過後我們可以把他從經驗性的東西提煉為理論性的,並且反過來再指導實踐,這應該就是我們學習並使用設計模式的初衷,這好比是政經中的價值規律,任何人都知道東西如果少了而需求大,它 馬上就漲,而反過來 就賤,可是學過政經後就可以...
設計模式筆記
設計模式精解p136,第11章 專家如何進行設計 alexander提到 從片段開始設計不是乙個好的設計方法。即將預先成型的部分新增在一起是無法得到優秀的軟體設計的。但還是可以得到可以工作的軟體的,只是大部分時候難於修改或擴充套件 我的觀點 軟體或者軟體系統都是由 功能模組 和這些 模組之間的聯絡 ...