前言
模板模式,這個在開發過程中比較常見,其主要是把子類公有的功能函數在模板類中聲明或者實現,用於優化邏輯和減少代碼。
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
模板模式比較常用,其核心思想仍然是繼承的思想,跟工廠模式,適配器模式有些許類似。