最近打算重構部分python項目,有道是"工欲善其事,必先利其器",因此有必要梳理一下相關設計模式。每次回顧基本概念或底層實現時都會有一些新的收穫,但願此次也不例外。html
本系列打算先簡略介紹面嚮對象語言的通用特性做爲鋪墊,這也是設計模式的基礎,而後詳細介紹python相關的設計模式,輔以簡單、易懂、經常使用的實例,最後略做總結。由於後續會分篇具體介紹各個設計模式的python實現,因此相應的連接會持續更新。java
設計模式的優勢 python
爲啥必定要使用設計模式呢?給個理由先:編程
- 複用成熟的解決方案:設計模式自己就是前人成功經驗的提煉和總結,咱們能夠從中獲益、少踩坑設計模式
- 便於開發過程當中的通用術語交流: 設計模式在項目分析和設計階段提供了共通的交流基準安全
- 類或對象之間的鬆耦合:鬆耦合帶來的明顯好處是易維護ui
- 面向接口編程:此特性的優勢在於易擴展,靈活性好spa
- 深刻理解面向對象體系:經過對設計模式的細節挖掘,能夠更透徹地理解面向對象體系的設計原理及具體實現設計
面向對象綜述
代理
面向對象經過類來實現對萬事萬物的抽象,包含三個重要特性:封裝,繼承和多態。這正是這三個特性衍生出多種多樣的設計模式及類與類之間的關係。
- 封裝:將類的某些信息隱藏在類的內部,限制外部使用者的直接訪問,只容許經過類提供的方法實現對隱藏信息的訪問和操做,隔離變化
- 繼承:對多個類型進行共性抽取造成父類,被共性抽取的多個類就是該父類的子類,共性抽取、父類和子類就是繼承的要素
- 多態:一個事物具備的多種形態。實現多態的方式有兩種:覆寫 & 重載
在如上三種特性基礎上能夠擴展出類與類之間六種不一樣的關係,總覽中只簡述,詳情參考連接。
- 依賴關係(Dependency): 在局部變量,方法的形參,或者對靜態方法的調用中實現
- 關聯關係(Association): 在類的成員變量中實現,能夠雙向也能夠單向
- 聚合關係(Aggregation): 強關聯,總體與部分的關係,可是可分離、生命週期相互獨立
- 組合關係(Composition): 更強關聯,總體與部分的關係,不可分離、生死與共
- 繼承關係(Generalization):類與類,或接口與接口之間的父子關係
- 實現關係(Implementation): 接口或抽象類定義好的操做集合,由實現類完成接口或抽象類的具體操做
Python對象特性
Python與設計模式相關的對象特性跟Java略有不一樣,python自己是動態語言,無interface且支持多重繼承;而Java是靜態強類型語言,有interface且只支持單繼承。
- 動態語言: 運行中能夠動態地改變類的內部結構,如鴨子類型的應用
- 弱類型語言(?): 這一點多少仍是有爭議的。從「變量類型由其值的類型決定」角度來講,python是弱類型語言;從「類型安全」的角度來講,python是強類型語言
- 無Interface: python中沒有相似java中的interface,因此須要面向接口編程時更多采用抽象類
- 多重繼承: python容許子類有多個父類,使用多重繼承時需注意繼承順序,建議謹慎使用。
設計模式七大原則
如何設計出簡潔、易懂、靈活、優美的代碼結構的確是一門學問,透徹理解並踐行以下七大原則一般都能取得基本滿意的結果。總覽中只簡述,詳情參考連接。
- 單一職責原則(Single Responsibility Principle):一個類負責一項職責,單純的快樂
- 開放關閉原則(Open-Closed Principle):對擴展開放,對修改關閉
- 里氏替換原則(Liskov Substitution Principle):繼承與派生的規則,子類可替換父類
- 依賴倒轉原則(Dependence Inversion Principle):高層模塊不該該依賴於底層模塊,兩者都應該依賴於抽象
- 接口隔離原則(Interface Segregation Principle):創建單一接口,儘可能細化接口,接口中的方法越少越好
- 迪米特法則(Law Of Demeter):高內聚,低耦合
- 組合/聚合複用原則 (Composition/Aggregation Reuse Principle):儘可能使用組合/聚合,最好不要使用繼承,尤爲是多重繼承
Python設計模式的分類
上面說了那麼多隻是引子,方便咱們理解設計模式的基礎概念和基本原則,接下來介紹python設計模式的分類及實現。固然此處僅爲模式列表,詳情點擊相關連接。
- 前導
- Python設計模式 - 基礎 - 封裝 & 繼承 & 多態
- Python設計模式 - 基礎 - 類與類之間的六種關係
- UML
- Python設計模式 - UML - 類圖(Class Diagram)
- Python設計模式 - UML - 對象圖(Object Diagram)
- Python設計模式 - UML - 包圖(Package Diagram)
- Python設計模式 - UML - 用例圖(Use Case Diagram)
- Python設計模式 - UML - 狀態圖(State Machine Diagram)
- Python設計模式 - UML - 時序圖(Sequence Diagram)
- Python設計模式 - UML - 組件圖(Component Diagram)
- Python設計模式 - UML - 部署圖(Deployment Diagram)
- Python設計模式 - UML - 活動圖(Activity Diagram)
- Python設計模式 - UML - 通訊圖(Communication Diagram)
- Python設計模式 - UML - 組合結構圖(Composite Structure Diagram)
- Python設計模式 - UML - 交互概述圖(Interaction Overview Diagram)
- Python設計模式 - UML - 定時圖(Timing Diagram)
- 分類
- Python設計模式 - 建立型 - 單例模式(Singleton) - 十種
- Python設計模式 - 建立型 - 簡單工廠(Factory)
- Python設計模式 - 建立型 - 工廠方法(Factory Method)
- Python設計模式 - 建立型 - 抽象工廠(Abstract Factory)
- Python設計模式 - 建立型 - 建造者(Builder)
- Python設計模式 - 建立型 - 原型(Prototype)
- Python設計模式 - 結構型 - 適配器(Adapter)
- Python設計模式 - 結構型 - 橋接(Bridge)
- Python設計模式 - 結構型 - 裝飾(Decorator)
- Python設計模式 - 結構型 - 組合(Composite)
- Python設計模式 - 結構型 - 外觀(Facade)
- Python設計模式 - 結構型 - 享元(Flyweight)
- Python設計模式 - 結構型 - 代理(Proxy)
- Python設計模式 - 行爲型 - 模板方法(Template Method)
- Python設計模式 - 行爲型 - 觀察者(Observer)
- Python設計模式 - 行爲型 - 狀態(State)
- Python設計模式 - 行爲型 - 策略(Strategy)
- Python設計模式 - 行爲型 - 責任鏈(Chain of Responsibility)
- Python設計模式 - 行爲型 - 命令(Command)
- Python設計模式 - 行爲型 - 訪問者(Visitor)
- Python設計模式 - 行爲型 - 中介者(Mediator)
- Python設計模式 - 行爲型 - 備忘錄(Memento)
- Python設計模式 - 行爲型 - 迭代器(Iterator)
- Python設計模式 - 行爲型 - 解釋器(Interpreter)
- Python設計模式 - 其餘 - 空對象(Null Object)
- Python設計模式 - 其餘 - 對象池(Object Pool)
- Python設計模式 - 其餘 - 圖搜索(Gragh Search)
- Python設計模式 - 其餘 - 不可變(Immutable)
- Python設計模式 - 其餘 - 黑板(Blackboard)
- Python設計模式 - 其餘 - 僱工(Servant)
- Python設計模式 - 其餘 - 過濾器(Filter)
- Python設計模式 - 其餘 - 共享(Borg)
- Python設計模式 - 總結
- 內置