模板方法模式
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
角色:
抽象类(AbstractClass):定义抽象的原子操作(钩子操作);实现一个模板方法作为算法的骨架。
具体类(ConcreteClass):实现原子操作
适用场景:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各个子类中的公共行为应该被提取出来并集中到一个公共父类中以避免代码重复。
控制子类扩展。模板方法只在特定点调用某操作,这样就只允许在这些点进行扩展。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from abc import ABCMeta, abstractmethod class IOHandler(metaclass=ABCMeta): @abstractmethod def open(self, name): pass @abstractmethod def deal(self, change): pass @abstractmethod def close(self): pass def process(self, name, change): self.open(name) self.deal(change) self.close() class FileHandler(IOHandler): def open(self, name): self.file = open(name,"w") def deal(self, change): self.file.write(change) def close(self): self.file.close() f = FileHandler() f.process("abc.txt", "Hello World") 模板方法模式
简单理解
class drinkBase(object): def __init__(self): pass def boil_water(self): print("把水煮开") def pour_kettle(self): print("把水倒入壶中") def add_ingredients(self): raise NotImplementedError def start_do(self): raise NotImplementedError def drink(self): print("开始享用") class drinkTea(drinkBase): def __init__(self): self.boil_water() self.pour_kettle() self.add_ingredients() self.start_do() self.drink() def add_ingredients(self): print("倒入茶叶") def start_do(self): print("按照煮茶的方式煮茶") class drinkCoffee(drinkBase): def __init__(self): self.boil_water() self.pour_kettle() self.add_ingredients() self.start_do() self.drink() def add_ingredients(self): print("倒入咖啡粉") def start_do(self): print("按照泡咖啡的方式煮咖啡") if __name__ == '__main__': tea = drinkTea() print("-"*50) coffee = drinkCoffee()
把水煮开
把水倒入壶中
倒入茶叶
按照煮茶的方式煮茶
开始享用
--------------------------------------------------
把水煮开
把水倒入壶中
倒入咖啡粉
按照泡咖啡的方式煮咖啡
开始享用