[設計模式]一兩句話的設計模式

創建型

速記口訣: 單抽工建原

  • 單例:只需一個實例時考慮。要麼沒有,要麼只有一個。
  • 工廠方法:在允許不修改工廠類的前提下添加新類。
  • 抽象工廠:當工廠方法無法滿足多系列問題時,再重構爲抽象工廠。提供相關性接口,無需具體指定
  • 建造者:多個部件的建造實現相同,只是所需部件、建造順序不同時考慮。構建與表示分離。
  • 原型:在初始化信息不發生變化時考慮。重複利用現有實例的拷貝。

結構型

速記口訣:橋代理組裝適配器,享元回家裝飾外觀。

  • 適配器:讓接口不相容的類能協同工作。解決新舊共存的問題。
  • 裝飾:對象動態添加職責。動態增加單個對象的額外職責,比生成子類更靈活。利用裝飾者類重複傳入裝飾對象,可以隨意增減裝飾方法。替代繼承方式解決類膨脹問題,擴展性極強。應用場景:源碼:ContextWrapper ,餐館混搭,奶茶混搭
  • 橋接:注重接口和實現的分離,注重多維度的變化。使繼承關係更改爲組合關係,使兩者可獨立變化。實現與抽象解耦。
  • 組合:簡單複雜等同操作。注重將一對多轉換爲一對一,樹型結構層次的關係。用樹狀結構表示“整體-部分”的層次關係,使單個對象(葉節點)與組合對象(枝節點)的使用具有一致性。
  • 享元:重複對象共享。爲運用共享技術。使用共享對象(對象池)實現對象的複用,需要分離內部狀態和外部狀態,可以大大節約內存。應用場景:handleMessage消息池複用;線程池,建立tcp消息池 
  • 代理:控制對單個對象的訪問。增加中間層次實現控制。
  • 外觀:一羣接口簡化爲一個接口。簡化接口和客戶端之間的調用依賴關係。

行爲型

速記口訣:訪問者寫好策略備忘錄,觀察模板迭代的狀態,命令中介解釋責任鏈。

  • 觀察者:一對多的監聽。一對多依賴關係,一端變化、多端得到通知並自動更新。(目標與觀察者可實現弱耦合)
  • 模板方法:抽象共同,具體子類具體實現。定義算法框架,使子類不改變結構的情況下改變行爲。應用場景:AsynTask、Activity生命週期、draw流程
  • 命令:把行爲進行抽象成命令。將請求發送者與具體實現者解耦,(多請求,單處理)。封裝命令對象傳遞請求給調用者,分離請求者和接收者,會增加大量的類,但是職責分明,高內聚,非常靈活容易擴展,可作爲回調的替代。
  • 職責鏈:多對象的處理。將處理者排成鏈,沿鏈傳遞請求。(單請求,多處理)發送請求給一個對象鏈條,該鏈條每個對象和它的下一對象綁定,實現發起者與最終接手者的解耦。應用場景:事件分發,公司各種權限的逐級申請,繼承製度
  • 狀態:抽象狀態類簡化複雜判斷。當對象內狀態改變而執行不同操作時考慮,狀態轉移邏輯不在if/switch中,而在各子類之間,增/改狀態和狀態轉換較容易。抽象狀態對象使得行爲在不同狀態下都能產生變化。應用場景,wifi管理,登錄狀態,下載狀態管理
  • 解釋器:若某特定問題發生的頻率足夠高時考慮,需定義文法表示與解釋器本身。
  • 中介者:中介類封裝引用。加入中介類來改變對象關係,使網狀結構變爲星型結構,多對多變爲一對多。應用於對象關係較爲複雜的情況。應用場景:Activity中view、model、邏輯交互
  • 訪問者:封裝對數據結構的操作。實現了訪問者和被訪問者分離,靈活且擴展性強;但違背了迪米特和依賴倒轉原則,被訪問元素若修改影響較大。細節:雙分派技術(雙動態綁定),訪問者的角色由它的實現對象確定,被訪問的角色也由它的具體對象決定
  • 策略:一系列方法的封裝。將一系列算法逐個封裝並可相互替換,易於切換、理解、擴展。
  • 備忘錄:保存發起人內部狀態。在該對象之外保存該對象的內部狀態。應用場景:saveInstanceState,事務回滾 
  • 迭代器:抽象遍歷集合元素。將對集合的訪問與遍歷從集合對象中分離出來到迭代器中。

設計模式異同對比

裝飾者vs代理模式

裝飾模式用作功能擴展,可以給相同對象不斷增加新的特徵;代理模式則偏向行爲控制,在方法執行前後做處理。

狀態模式vs策略模式

策略模式封裝可變更的算法解耦;狀態模式通過改變狀態控制行爲。

參考

發佈了448 篇原創文章 · 獲贊 176 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章