苏州工业园区规划建设局网站,云南网站建设公司排行,佛山企业网站设计制作,长沙网站建设案例什么是模板方法#xff08;Template Method#xff09;设计模式#xff1f;
模板方法#xff08;Template Method#xff09;是一种行为型设计模式#xff0c;它定义了一个算法的骨架#xff0c;将一些步骤延迟到子类中实现。这种模式允许子类为一个算法的特定步骤提供…什么是模板方法Template Method设计模式
模板方法Template Method是一种行为型设计模式它定义了一个算法的骨架将一些步骤延迟到子类中实现。这种模式允许子类为一个算法的特定步骤提供实现而不改变算法的结构。 模板方法模式通常包含两种类型的方法 模板方法Template Method 定义了算法的骨架提供了一个顶级的方法来定义算法的结构这个方法通常是 final 或者不可被子类重写的。模板方法一般会调用一系列的抽象方法或者具体方法。 抽象方法Abstract Method 在模板方法中被声明但是没有实现需要子类来实现具体的行为。
主要角色 抽象类Abstract Class 包含模板方法和抽象方法定义算法的结构和步骤。 具体子类Concrete Subclasses 实现抽象类中的抽象方法提供特定步骤的具体实现。
工作原理
定义算法的骨架包含一个模板方法。模板方法定义了算法的步骤其中某些步骤是抽象的由子类实现。子类提供特定步骤的实现但整个算法的流程控制由模板方法负责。 python3 实现模板方法设计模式示例代码一
一个简单的示例是咖啡和茶的制备过程。制备咖啡和茶有相似的步骤比如冲泡和加调味品但是具体的饮料种类和调味品可能有所不同。在模板方法模式中可以将冲泡和加调味品等步骤定义为模板方法而具体的咖啡和茶则是子类负责实现具体的冲泡方式和调味品。
这种模式允许在不改变算法结构的情况下定制算法中的特定步骤。
以下是一个使用模板方法设计模式的 Python 示例模拟了制备咖啡和茶的过程
from abc import ABC, abstractmethod# 抽象类定义了模板方法
class Beverage(ABC):def prepare(self):self.boil_water()self.brew()self.pour_in_cup()if self.customer_wants_condiments():self.add_condiments()def boil_water(self):print(Boiling water)abstractmethoddef brew(self):passdef pour_in_cup(self):print(Pouring into cup)abstractmethoddef add_condiments(self):pass# 钩子方法def customer_wants_condiments(self):return True# 具体子类实现特定的步骤
class Coffee(Beverage):def brew(self):print(Dripping coffee through filter)def add_condiments(self):print(Adding sugar and milk)def customer_wants_condiments(self):response input(Do you want to add sugar and milk? (y/n): )return True if response.lower() y else Falseclass Tea(Beverage):def brew(self):print(Steeping the tea)def add_condiments(self):print(Adding lemon)def customer_wants_condiments(self):response input(Do you want to add lemon? (y/n): )return True if response.lower() y else False# 客户端代码
if __name__ __main__:print(Making coffee...)coffee Coffee()coffee.prepare()print(\nMaking tea...)tea Tea()tea.prepare()在这个示例中Beverage 是抽象类定义了制备饮料的模板方法 prepare()以及一些抽象方法brew() 和 add_condiments()。Coffee 和 Tea 类是具体的子类分别实现了咖啡和茶的具体制作步骤。通过模板方法 prepare()它们调用了抽象方法完成了饮料的制作。其中 customer_wants_condiments() 是一个钩子方法允许子类控制特定步骤的实现。
python3 实现模板方法设计模式示例代码二
当考虑更实际的场景时模板方法模式可以应用在日志记录中。无论是将日志记录到文件、数据库或者控制台都有相似的流程但每种记录方式的具体步骤略有不同。
from abc import ABC, abstractmethodclass Logger(ABC):def log(self):self.connect()self.format_log()self.write_log()self.disconnect()abstractmethoddef connect(self):passabstractmethoddef format_log(self):passabstractmethoddef write_log(self):passabstractmethoddef disconnect(self):passclass FileLogger(Logger):def connect(self):print(File Logger: Connecting to file...)def format_log(self):print(File Logger: Formatting log...)def write_log(self):print(File Logger: Writing log to file...)def disconnect(self):print(File Logger: Disconnecting from file...)class DatabaseLogger(Logger):def connect(self):print(Database Logger: Connecting to database...)def format_log(self):print(Database Logger: Formatting log...)def write_log(self):print(Database Logger: Writing log to database...)def disconnect(self):print(Database Logger: Disconnecting from database...)class ConsoleLogger(Logger):def connect(self):print(Console Logger: Connecting to console...)def format_log(self):print(Console Logger: Formatting log...)def write_log(self):print(Console Logger: Displaying log on console...)def disconnect(self):print(Console Logger: Disconnecting from console...)if __name__ __main__:file_logger FileLogger()file_logger.log()print(\n)db_logger DatabaseLogger()db_logger.log()print(\n)console_logger ConsoleLogger()console_logger.log()这个示例展示了不同类型的日志记录器文件记录、数据库记录、控制台输出共享相同的记录流程但具体的记录方式各不相同。Logger 类定义了模板方法 log()而各种记录器类实现了该方法的抽象步骤。这样无论是文件记录、数据库记录还是控制台输出都能使用相同的模板方法进行记录。 使用模板方法设计模式时需要注意哪些地方
在使用模板方法设计模式时需要注意以下几个方面 定义模板方法 确保模板方法中包含算法的骨架定义了整个算法的流程和顺序。模板方法应该是 final 或者不可被子类重写以确保算法的稳定性。 区分抽象和具体方法 确保正确地区分抽象方法和具体方法。抽象方法应该由子类来实现而具体方法可以在抽象类中提供默认实现。 保持一致性和稳定性 模板方法模式旨在定义算法的骨架并且尽可能提供稳定的算法结构。因此在使用模板方法时应该确保算法中的步骤是稳定和一致的。 钩子方法的使用 如果需要在模板方法中控制特定步骤的实现可以使用钩子方法即具有默认实现的方法允许子类控制或改变算法的部分步骤。 维护封装性 确保在子类中不会直接访问或修改父类中的其他方法或属性以保持对象的封装性。 避免滥用模板方法模式 不要为了使用模板方法模式而人为地将一些不相关的操作强行放入模板方法中这可能会导致类过于臃肿和难以维护。 适当的抽象级别 考虑模板方法的抽象级别要确保足够的抽象来适应各种子类的实现但不要过度抽象导致子类难以实现。
总的来说使用模板方法设计模式时需要注意定义模板方法、合理使用抽象和具体方法、保持一致性和稳定性以及保持良好的封装性。同时要根据实际情况和需求适当地使用钩子方法并避免滥用模板方法模式。 本文就到这里了感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(ω)