設計模式

 

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()

接口隔離原則
View Code

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())

繼承和組合示例
View Code

3、設計模式分類spa

建立型模式:設計

總結建立型模式:代理

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

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

行爲型模式:blog

結構性模式:

相關文章
相關標籤/搜索