設計模式 【第一章】設計模式

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、設計模式分類

建立型模式:

總結建立型模式:

  依賴於繼承的建立型模式:工廠方法模式

  依賴於組合的建立型模式:抽象工廠模式,建立者模式

行爲型模式:

結構性模式:

相關文章
相關標籤/搜索