八年程序員通過案例手把手教你Python設計模式,機會難得!

如果你還在入門糾結,如果你還在苦惱怎麼入門python!小編有個建議,可以加小編弄的一個Python交流基地,大家可以進入交流基地:58937142,裡面新手入門資料,可以說從零到項目實戰,都是可以免費獲取的,還有程序員大牛為各位免費解答問題,熱心腸的小夥伴也是蠻多的。不失為是一個交流的的好地方,小編在這裡邀請大家加入我的大家庭。歡迎你的到來。一起交流學習!共同進步!小編等你!

設計模式的定義:為了解決面向對象系統中重要和重複的設計封裝在一起的一種代碼實現框架,可以使得代碼更加易於擴展和調用

四個基本要素:模式名稱,問題,解決方案,效果

六大原則:

1.開閉原則:一個軟件實體,如類,模塊和函數應該對擴展開發,對修改關閉.既軟件實體應儘量在不修改原有代碼的情況下進行擴展.

2.里氏替換原則:所有引用父類的方法必須能透明的使用其子類的對象

3.依賴倒置原則:高層模塊不應該依賴底層模塊,二者都應該依賴其抽象,抽象不應該依賴於細節,細節應該依賴抽象,換而言之,要針對接口編程而不是針對實現編程

4.接口隔離原則:使用多個專門的接口,而不是使用單一的總接口,即客戶端不應該依賴那些並不需要的接口

5.迪米特法則:一個軟件實體應該儘可能的少與其他實體相互作用

6.單一直責原則:不要存在多個導致類變更的原因.即一個類只負責一項職責

零:接口

定義:一種特殊的類,聲明瞭若干方法,要求繼承該接口的類必須實現這種方法

作用:限制繼承接口的類的方法的名稱及調用方式,隱藏了類的內部實現

1 from abc import ABCMeta,abstractmethod 2

一:單例模式

定義:保證一個類只有一個實例,並提供一個訪問它的全局訪問點

適用場景:當一個類只能有一個實例而客戶可以從一個眾所周知的訪問點訪問它時

優點:對唯一實例的受控訪問,相當於全局變量,但是又可以防止此變量被篡改

1 class Singleton(object):

二:簡單工廠模式

定義:不直接向客戶暴露對象創建的實現細節,而是通過一個工廠類來負責創建產品類的實例

角色:工廠角色,抽象產品角色,具體產品角色

優點:隱藏了對象創建代碼的細節,客戶端不需要修改代碼

缺點:違反了單一職責原則,將創建邏輯集中到一個工廠裡面,當要添加新產品時,違背了開閉原則

1 from abc import ABCMeta,abstractmethod 2

三:工廠方法模式

定義:定義一個創建對象的接口(工廠接口),讓子類決定實例化哪個接口

角色:抽象工廠角色,具體工廠角色,抽象產品角色,具體產品角色

適用場景:需要生產多種,大量複雜對象的時候,需要降低代碼耦合度的時候,當系統中的產品類經常需要擴展的時候

優點:每個具體的產品都對應一個具體工廠,不需要修改工廠類的代碼,工廠類可以不知道它所創建的具體的類,隱藏了對象創建的實現細節

缺點:每增加一個具體的產品類,就必須增加一個相應的工廠類

1 #!/usr/bin/env python

四:抽象工廠模式

定義:定義一個工廠類接口,讓工廠子類來創建一系列相關或相互依賴的對象

角色:抽象工廠角色,具體工廠角色,抽象產品角色,具體產品角色,客戶端

適用場景:系統要獨立於產品的創建和組合時,強調一系列相關產品的對象設計以便進行聯合調試時,提供一個產品類庫,想隱藏產品的具體實現時

優點:將客戶端與類的具體實現相分離,每個工廠創建了一個完整的產品系列,易於交換產品.有利於產品的一致性

缺點:難以支持新種類的產品

1 from abc import abstractmethod, ABCMeta 2

五:建造者模式

定義:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示

角色:抽象建造者,具體建造者,指揮者,產品

適用場景:當創建複雜對象的算法應該獨立於對象的組成部分以及它的裝配方式,當構造過程允許被構造的對象有不同的表示

優點:隱藏了一個產品的內部結構和裝配過程,將構造代碼與表示代碼分開,可以對構造過程進行更精確的控制

1 from abc import abstractmethod, ABCMeta 2

六:適配器模式

定義:將一個接口轉換為客戶希望的另一個接口,該模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作

角色:目標接口,待適配的類,適配器

適用場景:想使一個已經存在的類,但其接口不符合你的要求.想對一些已經存在的子類.不可能每一個都是用子類來進行適配,對象適配器可以適配其父類接口

八年程序員通過案例手把手教你Python設計模式,機會難得!

1 from abc import abstractmethod, ABCMeta 2

七:組合模式

定義:將對象組合成樹形結構以表示'部分-整體'的層次結構.組合模式使得用戶對單個對象和組合對象的使用具有一致性

角色:抽象組件,葉子組件,複合組件,客戶端

適用場景:表示對象的'部分-整體'層次結構,希望用戶忽略組合對象與單個對象的不同,用戶統一使用組合結構中的所有對象

優點:定義了包含基本對象和組合對象的類層次結構,簡化客戶端代碼,即客戶端可以一致的使用組合對象和單個對象,更容易新增新類型的組件

缺點:很難限制組合中的組件

1 rom abc import abstractmethod, ABCMeta 2

八:代理模式

定義:為其他對象提供一種代理以控制對特定對象的訪問

角色:抽象實體,實體,代理

適用場景:遠程代理(為遠程的對象提供代理),虛代理(根據需要創建很大的對象,即懶加載),保護代理(控制對原始對象的訪問,用於具有不同訪問權限的對象)

優點:遠程代理(可以隱藏對象位於遠程地址空間的事實),虛代理(可對大對象的加載進行優化),保護代理(允許在訪問一個對象時有一些附加的處理邏輯,例如權限控制)

1 from abc import ABCMeta, abstractmethod 2

九:觀察者模式

定義:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知並被自動更新.觀察者模式又稱為'發佈訂閱'模式

角色:抽象主題,具體主題(發佈者),抽象觀察者,具體觀察者(訂閱者)

適用場景:當一個抽象模型有兩個方面,其中一個方面依賴於另一個方面.將兩者封裝在獨立的對象中以使它們各自獨立的改變和複用

當一個對象的改變需要同時改變其他對象,而且不知道具體有多少對象以待改變

當一個對象必須通知其他對象,而又不知道其他對象是誰,即這些對象之間是解耦的

優點:目標和觀察者之間的耦合最小,支持廣播通信

缺點:多個觀察者之間互不知道對方的存在,因此一個觀察者對主題的修改可能造成錯誤的更新

1 from abc import ABCMeta, abstractmethod 2

十:策略模式

定義:定義一系列的算法把它們一個個封裝起來,並且使它們可相互替換.該模式使得算法可獨立於使用它的客戶而變化

角色:抽象策略,具體策略,上下文

適用場景:許多相關的類僅僅是行為有異,需使用一個算法的不同變體,算法使用了客戶端無需知道的數據,一個類中的多個行為以多個條件語句存在可以將其封裝在不同的策略類中

優點:定義了一系列可重用的算法和行為,消除了一些條件語句,可提供相同行為的不同實現

缺點:客戶必須瞭解不同的策略,策略與上下文之間的通信開銷,增加了對象的數目

1 from abc import ABCMeta, abstractmethod 2 import random 3

十一:責任鏈模式

定義:使多個對象有機會處理請求,從而避免請求的發佈者和接收者之間的耦合關係,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象能處理它為止

角色:抽象處理者,具體處理者,客戶端

適用場景:有多個對象可以處理一個請求,哪個對象處理由運行時決定

優點:降低耦合度,一個對象無需知道是其他哪一個對象處理其請求

缺點:請求不保證被接收,鏈的末端沒有處理或鏈配置錯誤

1 from abc import ABCMeta, abstractmethod 2
1 from abc import ABCMeta, abstractmethod 2 #--模仿js事件處理

十二:迭代器模式

定義:提供一種方法可順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部指示

適用場景:實現方法__iter__,__next__

1 class LinkedList:

十三:模板方法模式

定義:定義一個操作中算法的骨架,將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法某些特定的步驟

角色:抽象類(定義抽象的原子操作,實現一個模板方法作為算法的骨架),具體類(實現原子操作)

適用場景:一次性實現一個算法不變的部分,各個子類的公共行為,應該被提取出來集中到公共的父類中以避免代碼重複,控制子類擴展

1 from abc import ABCMeta, abstractmethod 2

相關推薦

推薦中...