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