python 设计模式(八) 模板方法模式(template method pattern)

模板方法模式:父类定义了抽象方法和调用抽象方法顺序执行的方法,子类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分钟, 盐+十三香+味精, 陶瓷容器, 

好了,小明不用饿肚子了,开始吃饭了
《python 设计模式(八) 模板方法模式(template method pattern)》
《python 设计模式(八) 模板方法模式(template method pattern)》
《python 设计模式(八) 模板方法模式(template method pattern)》

    原文作者:ruguowoshiyu
    原文地址: https://blog.csdn.net/ruguowoshiyu/article/details/80872937
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞