1、什麼是設計模式編程
每個模式描述了一個在咱們周圍不斷重複發生的問題,以及該問題的解決方案的核心。這樣你就能一次又一次地使用該方案而沒必要作重複勞動。」
每個設計模式系統地命名、解釋和評價了面向對象系統中一個重要的和重複出現的設計。
GoF(Gang of Four)
設計模式四個基本要素:模式名稱、問題、解決方案、效果
2、設計模式的七大原則設計模式
1、開放封閉原則:一個軟件實體如類,模塊和函數應該對擴展是開放的,對修改是關閉的。即軟件實體應儘可能在不修改原有代碼的狀況下進行擴展(裝飾器) 2、里氏替換原則:重寫父類裏面的方法,邏輯可能不同,可是返回的結果參數啥的要同樣(全部引用基類的地方必須能透明的使用其子類的對象) 3、依賴倒置原則:高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象,要針對接口編程,而不是針對實現編程。(接口類) 4、接口隔離原則:使用多個專門的接口,而不使用單一的總接口,即客戶端不該該依賴那些它不須要實現的接口 5、迪米特法則:一個軟件實體應當儘量少的與其餘實體發生相互做用 6、單一職責原則:一個類只負責一項職責(不要存在多於一個致使類變動的緣由,即一個類只負責一項職責) 7、合同複用原則:多用組合少用繼承 一個類重用另外一個類的代碼有兩種方式 繼承 組合
a、接口隔離原則ide
#假如說如今有這樣的動物類 from abc import abstractmethod,ABCMeta #藉助abc模塊來實現接口 #接口類就是爲了提供標準,約束後面的子類 # class Animal(metaclass=ABCMeta): # @abstractmethod # def walk(self): # pass # # @abstractmethod # def fly(self): # pass # # @abstractmethod # def swim(self): # pass # # class Frog(Animal): # '''像是這樣定義一個青蛙類,因爲接口類的方法都要被實現,而青蛙只會走,沒不要要實現其餘的方法 # 動物不一樣會的功能也會不一樣,因此這時候咱們就能夠選擇用接口隔離原則 # ''' # def walk(self): # print('青蛙會走') # # obj = Frog() # obj.walk() #會報錯 # =====================改進-================= class AnimalOnLand(metaclass=ABCMeta): '''在陸地上的動物''' @abstractmethod def walk(self): pass class AnimalInSky(metaclass=ABCMeta): '''飛行動物''' @abstractmethod def fly(self): pass class AnimalInWater(metaclass=ABCMeta): '''在水裏的動物''' @abstractmethod def swim(self): pass class Tiger(AnimalOnLand): def walk(self): print('老虎在地上') class Frog(AnimalOnLand,AnimalInWater): def swim(self): print('青蛙會遊') def walk(self): print('會跳') obj = Tiger() obj.walk() obj = Frog() obj.walk() obj.swim() 接口隔離原則
b、繼承和組合函數
# 合同複用原則:多用組合少用繼承 class A: def test(self): return '你好啊' class B(A): #繼承 def test(self): return 123 class C: def __init__(self): self.a = A() #組合 self.a.test() def test(self): return 789 print(B().test()) print(C().a) print(C().a.test()) print(C().test()) 繼承和組合示例
3、設計模式分類spa
建立型模式:設計
總結建立型模式:代理
依賴於繼承的建立型模式:工廠方法模式code
依賴於組合的建立型模式:抽象工廠模式,建立者模式對象
行爲型模式:blog
結構性模式: