模板方法模式:父类定义了抽象方法和调用抽象方法顺序执行的方法,子类override父类的抽象方法。比如在解决需要分步执行的问题就可以采用这种方法。
还以炒菜举例:
背景:小明的父母出远门度假去了,只有小明和姐姐一个人在家,碰巧小明的姐姐失恋了,无心为小明准备食物。看来小明只能自己准备饭菜了, 饭是好准备的,交给电饭煲就行了。那菜呢?这可是个头疼事,不会做怎么办,只能谷歌了。GOOGLE了一小时后,小明总结了做菜的几个步骤:
1 清洗蔬菜,并用刀切好(蔬菜可以是豆腐+白菜,辣椒+肉等)
2 准备辅料(辅料可以是葱,姜,八角)
4 放入油,热锅, 放入蔬菜,并用锅铲炒(有的菜要炒5分钟, 有的菜要炒10分钟)
4 加入调味料(调味料可以是(盐+鸡精),(盐+十三香+味精))
5 出锅(可以用玻璃容器,也可以用陶瓷容器)
那就开始做菜吧,下面的代码做了两道菜
菜a:(豆腐+白菜)+ (葱+姜)+ (炒5分钟)+(盐+鸡精)+(玻璃容器)
菜b :(辣椒+肉) + (葱+八角+姜)+ (炒10分钟) + (盐+十三香+味精) + (陶瓷容器)
import abc
class Cooking(object):
"""
炒菜基类,实现了几个抽象方法,及炒菜顺序调用方法cook
"""
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def clean_vegetables(self, *args, **kwargs):
"""
准备蔬菜
:param args:
:param kwargs:
:return:
"""
pass
@abc.abstractmethod
def prepare_accessories(self, *args, **kwargs):
"""
准备辅料
:param args:
:param kwargs:
:return:
"""
pass
@abc.abstractmethod
def stir_fry(self, *args, **kwargs):
"""
炒菜
:param args:
:param kwargs:
:return:
"""
pass
@abc.abstractmethod
def put_flavoring(self, *args, **kwargsl):
"""
放入调味料
:param args:
:param kwargsl:
:return:
"""
pass
@abc.abstractmethod
def end_pot(self, *args, **kwargs):
"""
出锅
:param args:
:param kwargs:
:return:
"""
pass
def cook(self):
"""
炒菜顺序执行方法
:return:
"""
self.clean_vegetables().\
prepare_accessories().\
stir_fry().\
put_flavoring().\
end_pot()
class Dish_a(Cooking):
"""
(豆腐+白菜)+ (葱+姜)+ (炒5分钟)+(盐+鸡精)+(玻璃容器)
"""
def __init__(self):
self.dish = ""
def clean_vegetables(self):
self.dish += '白菜+豆腐' + ', '
return self
def prepare_accessories(self):
self.dish += '葱+姜' + ', '
return self
def stir_fry(self):
self.dish += '炒5分钟' + ', '
return self
def put_flavoring(self):
self.dish += '盐+鸡精' + ', '
return self
def end_pot(self):
self.dish += '玻璃容器' + ', '
class Dish_b(Cooking):
"""
(辣椒+肉) + (葱+八角+姜)+ (炒10分钟) + (盐+十三香+味精) + (陶瓷容器)
"""
def __init__(self):
self.dish = ""
def clean_vegetables(self):
self.dish += '辣椒+肉' + ', '
return self
def prepare_accessories(self):
self.dish += '葱+八角+姜' + ', '
return self
def stir_fry(self):
self.dish += '炒10分钟' + ', '
return self
def put_flavoring(self):
self.dish += '盐+十三香+味精' + ', '
return self
def end_pot(self):
self.dish += '陶瓷容器' + ', '
if __name__ == '__main__':
dish_a = Dish_a()
dish_b = Dish_b()
dish_a.cook()
dish_b.cook()
print('第一道菜:', dish_a.dish)
print('第二道菜:', dish_b.dish)
结果如下
第一道菜: 白菜+豆腐, 葱+姜, 炒5分钟, 盐+鸡精, 玻璃容器,
第二道菜: 辣椒+肉, 葱+八角+姜, 炒10分钟, 盐+十三香+味精, 陶瓷容器,
好了,小明不用饿肚子了,开始吃饭了