前言
模板模式,这个在开发过程中比较常见,其主要是把子类公有的功能函数在模板类中声明或者实现,用于优化逻辑和减少代码。
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
模板模式比较常用,其核心思想仍然是继承的思想,跟工厂模式,适配器模式有些许类似。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16580.html