python 設計模式之 -- 模板模式

前言

模板模式,這個在開發過程中比較常見,其主要是把子類公有的功能函數在模板類中聲明或者實現,用於優化邏輯和減少代碼。

1.什麼是模板模式

舉一個通俗的例子,你有一枚印章,蓋章的時候一般都用紅色的印泥;某一天到了你兒子手中,他各種顏色都給你塗上,咳…,然後蓋在你臉上,紅的綠的紫的…那個印章就是模板,各種顏色就是不同需求,產生的顏色雖然不同,但是本質上還是你的名字。
《圖解設計模式》中是這麼定義模板模式的:在父類中定義處理流程的框架,在子類中實現具體處理的模式。

2.普通寫法

假如有兩個過程,泡茶和衝咖啡

class MakeTea(object):
    def __init__(self, temperature, water):
        self.temperature = temperature
        self.water = water

    def add_water(self):
        print('add', self.water, 'water')

    def heat(self):
        print('heat water to', self.temperature)

    @staticmethod
    def add_tea():
        print('add tea')

    def make_tea(self):
        self.add_water()
        self.heat()
        self.add_tea()


class MakeCoffee(object):
    def __init__(self, temperature, water):
        self.temperature = temperature
        self.water = water

    def heat(self):
        print('heat water to', self.temperature)

    def add_water(self):
        print('add', self.water, 'water')

    @staticmethod
    def add_coffee():
        print('add coffee')

    def make_coffee(self):
        self.add_water()
        self.heat()
        self.add_coffee()

我們起一個泡茶的過程:

if __name__ == '__main__':
    make_tea = MakeTea(100, '500ml')
    make_tea.make_tea()

打印結果:

add 500ml water
heat water to 100
add tea

我們仔細分析上面兩個過程類,泡茶和衝咖啡有很多共同之處,加熱和加水這兩個過程完全一樣,兩個類都實現了一遍,貌似有點代碼冗餘。

3.模板模式

我們這裏定義一個 MakeDrink 類,這個類是 MakeTea 和 MakeCoffee 類的模板類,實現了公用的 add_water() 和 heat() 方法

class MakeDrink(object):
    def __init__(self, temperature, water):
        self.temperature = temperature
        self.water = water

    def add_water(self):
        print('add', self.water, 'water')

    def heat(self):
        print('heat water to', self.temperature)

    def make_drink(self):
        pass

然後我們繼承上面這個模板,生成一個新的泡茶的類

class MakeCoffee(MakeDrink):
    def __init__(self, temperature, water):
        super(MakeCoffeeT, self).__init__(temperature, water)

    @staticmethod
    def add_coffee():
        print('add coffee')

    def make_drink(self):
        self.add_water()
        self.heat()
        self.add_coffee()

新類中,添加獨有的 add_coffee() 方法,並實現了 make_drink() 方法,簡單測試一下

if __name__ == '__main__':
    make_coffee = MakeCoffee(85, '200ml')
    make_coffee.make_drink()

結果:

add 200ml water
heat water to 85
add coffee

4.notes

模板模式比較常用,其核心思想仍然是繼承的思想,跟工廠模式,適配器模式有些許類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章