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

模板模式比较常用,其核心思想仍然是继承的思想,跟工厂模式,适配器模式有些许类似。

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