笔记:python设计模式
文章目錄
- 概述
- 什么是設計模式
- 為什么使用設計模式
- python設計模式
- 1. 策略模式
- 2. 適配器模式
- 3. 工廠模式
- 4. 裝飾器模式
- 5. 單例模式
- 小結
概述
整理網上python設計模式資料并梳理。
來源:
- 設計模式是什么 http://blog.jobbole.com/62023/
- python設計模式 https://www.jianshu.com/p/4f4795f2c9b9
- https://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html
什么是設計模式
- 按照設計方法理解,就是“套路”,對經常碰到的一些編程問題的可重用解決方案。
- 按照程序設計的基本概念來理解,就是增加一個抽象層,將程序代碼中不變的核心和結構抽取出來。
- 所以,設計模式的目的就是分離代碼中的可變部分,這樣不僅會使代碼可維護性更高,而且會讓代碼更易于理解,從而降低開發成本。
- 這個可變部分,是運行時要求的可變:按照上下文選擇程序和數據結構。
為什么使用設計模式
理論上來說,設計模式是經過總結優化的、比較好的解決方案,代表最佳實踐。
只要是面向對象編程,設計模式的理念都可以融入;反過來說,如果是面向過程編程則很少使用設計模式,或者說用處不大。(換句話說,OPP很難分離代碼中可變部分?有待深入理解)
python設計模式
python是面向對象的編程語言,設計模式可以融入,并且有自身特點。
1. 策略模式
與行為相關的設計模式:允許在運行時根據指定的上下文確定程序的動作。
你可以在兩個類中封裝不同的算法,并且在程序運行時確定到底執行哪種策略。
例子
在上面的例子中,策略是根據實例化時context變量的值來決定的。如果給定context變量的值是“class_one”,將會執行class_one,否則就會執行class_two。
2. 適配器模式
一個結構性的設計模式,允許通過不同的接口為一個類賦予新的用途,這使得使用不同調用方式的系統都能夠使用這個類。
3. 工廠模式
一個就像工廠那樣生產對象實例的類,將可能涉及到很多類的對象創建過程封裝到一個單獨的方法中。通過給定的上下文輸出指定的對象實例。
例子
有一個按鈕類,有多種變體,例如圖片按鈕、輸入框按鈕或是flash按鈕等。在不同的場合需要創建不同的按鈕,這時候就可以通過一個工廠來創建不同的按鈕。
然后創建工廠類:
class ButtonFactory():def create_button(self, typ):targetclass = typ.capitalize()return globals()[targetclass]()globals()將以字典的方式返回所有全局變量,因此targetclass = typ.capitalize()將通過傳入的typ字符串得到類名(Image、Input或Flash),而globals()[targetclass]將通過類名取到類的類(見元類),而globals()targetclass將創建此類的對象。
可以這么使用工廠類:
button_obj = ButtonFactory() button = ['image', 'input', 'flash'] for b in button:print button_obj.create_button(b).get_html()輸出將是所有按鈕類型的HTML屬性。這樣就能根據不同的情況指定不同類型的按鈕,且易于重用。
4. 裝飾器模式
一個結構性模式,允許根據情況在運行時為一個對象添加新的或附加的行為,目的是為給一個特定的對象實例應用擴展的函數方法,并且同時也能夠產生沒有新方法的原對象。
5. 單例模式
一個創建型的設計模式,確保運行時對某個類只存在單個實例對象,并且提供一個全局的訪問點來訪問這個實例對象。
因為對于調用單例的其他對象而言這個全局唯一的訪問點“協調”了對單例對象的訪問請求,所以這些調用者看到的單例內變量都將是同一份。
小結
- 習慣于OPP編程,確實很難理解設計模式為什么有用。加了一個抽象層,閱讀代碼是否更容易,值得商榷。
- python語言本身的特點,尤其還有eval()函數,選擇比較多。可能設計模式真的只適合java這種僵硬的語言(一片“符號的海洋”)。C++應用應該也還好。
- 裝飾器模式可能使用比較頻繁。
- 分離代碼中的可變部分是核心,也可以有其它實現方式。
總結
以上是生活随笔為你收集整理的笔记:python设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (摘要)新基建风口下,今年工业互联网平台
- 下一篇: KMP算法的核心,是一个被称为部分匹配表