基于Python的23種經(jīng)典設(shè)計(jì)模式實(shí)戰(zhàn)(超全)!
共 3567字,需瀏覽 8分鐘
·
2024-07-19 14:42
當(dāng)你凝視電腦屏幕,琢磨著如何實(shí)現(xiàn)新的程序功能時(shí),你不僅在想將使用哪些數(shù)據(jù)和哪些對象,更在想如何以更優(yōu)雅、更通用的方式來實(shí)現(xiàn)這個(gè)程序。你在腦海中構(gòu)思代碼的功能以及代碼之間的交互,并勾畫出整體解決方案,然后才會(huì)著手編寫代碼。
最佳的整體解決方案應(yīng)當(dāng)具有高重用性和高可維護(hù)性,由此設(shè)計(jì)模式越來越受到重視,它能滿足對精致、簡單且可重用的解決方案的需求。設(shè)計(jì)模式這個(gè)詞對于初學(xué)者來說聽起來有點(diǎn)陌生,它是在項(xiàng)目和程序員之間重用面向?qū)ο蟠a的便捷方法。設(shè)計(jì)模式的理念很簡單:程序員經(jīng)常發(fā)現(xiàn),將對象之間的常用交互記錄下來并做好分類,對編程非常有幫助。
早期編程框架的文獻(xiàn)中經(jīng)常引用的一種模式是 Smalltalk 的“數(shù)據(jù)模型 – 視圖 – 控制器” 框架(Krasner 和 Pope,1988 年),它將用戶界面分為數(shù)據(jù)模型(包含程序的計(jì)算部分)、視圖(用戶界面顯示),以及控制器(用戶和視圖之間的交互控制),如下圖所示。
圖:數(shù)據(jù)模型 – 視圖 – 控制器框架
用戶界面的每個(gè)方面都是一個(gè)單獨(dú)的對象,并且每個(gè)方面都有自己的數(shù)據(jù)管理準(zhǔn)則。應(yīng)該謹(jǐn)慎控制用戶、GUI 和數(shù)據(jù)之間的通信,因此需要讓三者的功能相互獨(dú)立。
換句話說,設(shè)計(jì)模式描述了對象之間如何在不干擾彼此數(shù)據(jù)模型和方法的情況下進(jìn)行通信。保持這種獨(dú)立一直是面向?qū)ο缶幊痰哪繕?biāo)。
設(shè)計(jì)模式在 20 世紀(jì) 90 年代初期被 Erich Gamma 正式認(rèn)可,他描述了 GUI 應(yīng)用程序框架 ET++ 中包含的模式。這些討論和一系列技術(shù)會(huì)議的高潮是 Gamma、Helm、Johnson 和Vlissides 編著的 Design Patterns: Elements of Reusable Software。這本暢銷書對程序員產(chǎn)生了巨大的影響。它包含多種常見且通用的設(shè)計(jì)模式,以及如何和何時(shí)應(yīng)用它們的注釋。
后來也有許多類似的書籍出版,其中包括流行的 Java Design Patterns: A Tutorial 和 C# Design Patterns: A Tutorial。Rhodes 建立了一個(gè) Phython 設(shè)計(jì)模式網(wǎng)站,該網(wǎng)站內(nèi)容描述了Python 如何運(yùn)用設(shè)計(jì)模式。
設(shè)計(jì)模式是常用的算法,它描述了類之間的通信的簡便方法。模式的探索過程稱為模 式挖掘。Design Patterns: Elements of Reusable Software 中設(shè)計(jì)模式已被廣泛應(yīng)用,這些設(shè)計(jì)模式分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式三類。
創(chuàng)建型模式為用戶創(chuàng)建對象,而不是讓用戶直接實(shí)例化對象。程序能夠在給定情況 下靈活決定需要?jiǎng)?chuàng)建哪些對象。
結(jié)構(gòu)型模式可幫助用戶將若干對象組合成更大的結(jié)構(gòu),例如復(fù)雜的用戶界面或費(fèi)用 計(jì)算數(shù)據(jù)。
行為型模式可幫助定義系統(tǒng)中對象之間的通信,并控制復(fù)雜程序的流程。
設(shè)計(jì)模式的學(xué)習(xí)分為接受、識別和領(lǐng)悟。首先接受設(shè)計(jì)模式;然后識別設(shè)計(jì)模式以決 定何時(shí)可以使用該它們;最后領(lǐng)悟設(shè)計(jì)模式,以了解哪些模式可以幫助解決給定的設(shè)計(jì)問題。
使用設(shè)計(jì)模式可保持類分離,并防止它們彼此“了解”太多。同等重要的是,使用設(shè)計(jì)模式可以借鑒其他程序員的經(jīng)驗(yàn),從而更簡捷地描述編程方法。
面向?qū)ο蟮姆椒ㄊ褂迷S多策略來實(shí)現(xiàn)類分離,其中包括封裝和繼承。幾乎所有具有面 向?qū)ο蠊δ艿恼Z言都支持繼承。從父類繼承的類可以訪問該父類的所有方法,還可以訪問父類所有變量。但是,通過一個(gè)完整的工作類開始繼承層次結(jié)構(gòu),可能會(huì)過度限制程序的 功能。使用設(shè)計(jì)模式可對接口進(jìn)行編程而不是對最終的實(shí)現(xiàn)方式進(jìn)行編程。
更簡捷地說,使用抽象類或接口來定義任何類的層次結(jié)構(gòu)的頂層,不具體實(shí)現(xiàn)任何方 法,而是定義類將要支持的方法。Python 不直接支持接口,但它允許編寫抽象類。例如 DButton 類的 comd 接口。
class DButton(Button):def __init__(self, master, **kwargs):super().__init__(master, **kwargs)super().config(command=self.comd)# abstract method to be called by childrendef comd(self): pass
這是抽象類的一個(gè)很好的程序示例,在派生按鈕(DButton)類中用戶定義具體實(shí)現(xiàn)命 令的方法。它也是命令模式的一個(gè)程序示例。面向?qū)ο蟮牧硪粋€(gè)主要方法是對象組合,我們已經(jīng)在 Statelist 程序示例中展示了這種方法。對象組合只是構(gòu)建包含其他對象的對象—將多個(gè)對象封裝在另一個(gè)對象中。初次學(xué)習(xí)面向?qū)ο蟮姆椒▋A向于使用繼承來解決所有問題,但是當(dāng)開始編寫更復(fù)雜的程序時(shí),對象組合的優(yōu)勢就變得明顯了。因此,建議優(yōu)先使用對象組合而不是繼承。
《Python設(shè)計(jì)模式實(shí)戰(zhàn)》將討論用 Python 編寫 23 種經(jīng)典設(shè)計(jì)模式,并至少為每種模式提供一個(gè)示例程序。
本書作者基于多年的編程和項(xiàng)目實(shí)踐經(jīng)驗(yàn),系統(tǒng)地總結(jié)和優(yōu)化了 Python 編程中可重用的解決方案,并加以分類編目,形成三大類可復(fù)用的 Python 設(shè)計(jì)模式。
本書第一部分介紹了Python 設(shè)計(jì)模式基礎(chǔ)知識,包括面向?qū)ο缶幊蹋∣OP)、Python 可視化編程及設(shè)計(jì)模式。第二部分創(chuàng)建型模式、第三部分結(jié)構(gòu)型模式和第四部分行為型模式系統(tǒng)介紹了工廠模式、單例模式、生成器模式、原型模式、適配器模式、橋接模式、組合模式、裝飾器模式、外觀模式、 享元模式、代理模式、訪問者模式等。為方便 Python 愛好者快速上手,本書還給出了使用場景、功能詳解、程序示例,以及 Github 庫中完整的示例程序及相關(guān)數(shù)據(jù)文件等。第五部分介紹了 Python 語法、函數(shù)、開發(fā)環(huán)境等 Python 基礎(chǔ)知識,結(jié)合設(shè)計(jì)模式中的應(yīng)用程序?qū)嵺`,幫助讀者輕松學(xué)習(xí) Python 語言。
