python 設計模式(二) 六大設計原則一 單一職責原則(SRP)

單一職責原則(single responsibility principle)

        簡稱SRP。There should never be more than one reason for a class to change.僅有一種原因引起類的改變。一個類只負責一個職責。

單一職責原則 這地址講的很好,但不是用python語言實現的,在這裏我用python語言實現一下。

問題由來:類A負責職責1和職責2,在正常運行中沒有出現任何問題,但當職責1改變時,需要修改類A,可能引起正常運行的職責2發生問題

解決方案:遵循單一職責原則,分別創建類A和類B來負責職責1和職責2。這樣設計當修改其一,並不會影響其二工作

在工程實踐中,隨着項目修改的變更或者其他原因,經常會出現職責擴散,比如類A原本負責職責1,但由於需求的變更,職責1被細分爲職責11和職責12,導致類A無法正常工作

實例代碼python實現

class Animal(object):
    def __init__(self):
        pass

    def breathe(self, name):
        print('%s 呼吸空氣' %name)


# caller
class Client(object):
    def __init__(self):
        pass

    def work(self):
        animal = Animal()
        animal.breathe('牛')
        animal.breathe('羊')
        animal.breathe('豬')


if __name__ == '__main__':
    client = Client()
    client.work()

結果

牛 呼吸空氣
羊 呼吸空氣
豬 呼吸空氣

上述代碼實現了一個類Animal,僅僅實現了一個職責---------------breathe。客戶端調用後得到上面的結果。

但如果又增加了一種動物-----------魚,很明顯魚是不能呼吸空氣得的,因此要對類Animal進行修改,或者把類直接拆分爲兩個類分別實現水生動物的breathe和陸生動物的breathe.

改進1:類Animal中增加一個新的方法breathe1

class Animal(object):
    def __init__(self):
        pass

    def breathe(self, name):
        print('%s 呼吸空氣' %name)

    def breathe1(self, name):
        print('%s 呼吸水' %name)


# caller
class Client(object):
    def __init__(self):
        pass

    def work(self):
        animal = Animal()
        animal.breathe('牛')
        animal.breathe('羊')
        animal.breathe('豬')
        animal.breathe1('魚')


if __name__ == '__main__':
    client = Client()
    client.work()

結果

牛 呼吸空氣
羊 呼吸空氣
豬 呼吸空氣
魚 呼吸水

改進2:把類Animal拆分爲兩個類分別負責陸生動物呼吸和水生動物呼吸

代碼入下:

class Terrestrialanimal(object):

    def __init__(self):
        pass

    def breathe(self, name):
        print('%s 呼吸空氣' %name)


class Aquatic(object):

    def __init__(self):
        pass

    def breathe(self, name):
        print('%s 呼吸水' %name)


# caller
class Client(object):
    def __init__(self):
        pass

    def work(self):
        terrestrialanimal = Terrestrialanimal()
        terrestrialanimal.breathe('牛')
        terrestrialanimal.breathe('羊')
        terrestrialanimal.breathe('豬')

        aquatic = Aquatic()
        aquatic.breathe('魚')


if __name__ == '__main__':
    client = Client()
    client.work()

結果

牛 呼吸空氣
羊 呼吸空氣
豬 呼吸空氣
魚 呼吸水






發佈了54 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章