• 设计模式- 模板方法模式(Template Method Pattern) 结构|原理|优缺点|场景|示例


                                         设计模式(分类)        设计模式(六大原则)   

        创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

        结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

        行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式        责任链模式        命令模式

                                       备忘录模式          状态模式          访问者模式        中介者模式


    模板方法模式(Template Method Pattern)是一种行为型设计模式,用于定义一个算法的骨架,而将一些步骤的具体实现延迟到子类中。这样,可以在不改变算法结构的情况下,让子类重新定义算法中的某些步骤。

    主要角色:

    1. 抽象类(Abstract Class):定义一个模板方法(Template Method),其中包含算法的框架,以及一些抽象方法或具体方法。抽象类中的模板方法定义了算法的步骤顺序,并调用了具体的方法,这些方法可以是抽象的,由子类去实现。

    2. 具体子类(Concrete Class):继承自抽象类,实现了其中定义的抽象方法,提供了算法中特定步骤的具体实现。具体子类可以覆盖抽象类中的方法,以实现特定的行为。

    工作原理:

    1. 抽象类定义了一个模板方法,其中包含了算法的骨架,以及一些抽象方法或具体方法。
    2. 具体子类继承抽象类,并实现其中的抽象方法,提供算法中特定步骤的具体实现。
    3. 客户端通过调用抽象类中的模板方法来使用算法,具体子类会按照模板方法定义的算法框架执行相应的步骤。

    优点:

    • 提高代码复用性:通过抽象模板方法,封装了算法的通用部分,使得代码更易于维护和扩展。
    • 灵活性:允许子类根据需要重新定义或扩展算法中的特定步骤,从而实现定制化。
    • 便于管理:通过模板方法对算法进行统一管理和调度,提高了代码的结构化程度。

    缺点:

    • 可能导致代码膨胀:如果模板方法中的步骤过多或过于复杂,会增加子类的实现难度,导致代码膨胀。
    • 限制灵活性:模板方法模式可能限制了子类的灵活性,特定步骤的实现必须符合父类定义的算法框架。

    适用场景:

    模板方法模式适用于以下场景:

    • 当需要实现一组算法中的共同部分,并将可变部分延迟到子类中时。
    • 当存在多个具有相似算法结构但实现细节不同的情况时。
    • 当希望通过一个固定的算法框架来管理和调度算法时。
    代码示例(以Java为例)
    1. // 抽象类定义了算法框架
    2. abstract class AbstractClass {
    3. // 模板方法定义了算法的骨架,调用了具体的方法
    4. public void templateMethod() {
    5. step1();
    6. step2();
    7. step3();
    8. }
    9. // 具体方法,有默认实现
    10. protected void step1() {
    11. System.out.println("AbstractClass: Performing step 1");
    12. }
    13. // 抽象方法,由子类实现
    14. protected abstract void step2();
    15. // 具体方法,可以在子类中选择是否覆盖
    16. protected void step3() {
    17. System.out.println("AbstractClass: Performing step 3");
    18. }
    19. }
    20. // 具体子类实现了抽象类中的抽象方法
    21. class ConcreteClass extends AbstractClass {
    22. // 实现了抽象方法
    23. @Override
    24. protected void step2() {
    25. System.out.println("ConcreteClass: Performing step 2");
    26. }
    27. }
    28. public class Main {
    29. public static void main(String[] args) {
    30. // 创建具体子类对象
    31. AbstractClass obj = new ConcreteClass();
    32. // 调用模板方法
    33. obj.templateMethod();
    34. }
    35. }

    代码示例(以Python为例)

    1. from abc import ABC, abstractmethod
    2. # 抽象类定义了算法框架
    3. class AbstractClass(ABC):
    4. # 模板方法定义了算法的骨架,调用了具体的方法
    5. def template_method(self):
    6. self.step1()
    7. self.step2()
    8. self.step3()
    9. # 具体方法,有默认实现
    10. def step1(self):
    11. print("AbstractClass: Performing step 1")
    12. # 抽象方法,由子类实现
    13. @abstractmethod
    14. def step2(self):
    15. pass
    16. # 具体方法,可以在子类中选择是否覆盖
    17. def step3(self):
    18. print("AbstractClass: Performing step 3")
    19. # 具体子类实现了抽象类中的抽象方法
    20. class ConcreteClass(AbstractClass):
    21. # 实现了抽象方法
    22. def step2(self):
    23. print("ConcreteClass: Performing step 2")
    24. if __name__ == "__main__":
    25. # 创建具体子类对象
    26. obj = ConcreteClass()
    27. # 调用模板方法
    28. obj.template_method()

    在这个示例中,AbstractClass 是抽象类,定义了模板方法 templateMethod() 和具体方法 step1()step3(),以及抽象方法 step2()ConcreteClass 是具体子类,实现了抽象方法 step2()。在 Main 类中,我们创建了 ConcreteClass 的对象,并调用了模板方法 templateMethod(),它按照定义的算法骨架执行了相应的步骤。

  • 相关阅读:
    mathlive在vue中使用
    GIS工具maptalks开发手册(二)01-02之GeoJSON转化为Geometry——渲染点
    IDC 中国边缘云市场最新报告解读:阿里云蝉联中国公有云市场第一
    python3-turtle(1)
    80%月薪过万的测试员都避开了这些坑,知道这些,帮助你快速月薪翻倍~
    网页大作业代码自取【HTML+CSS制作美味糖果网站】
    重学SpringBoot3-整合SSM
    【腾学汇的第1个实验代码】应用Matplotlib绘制图标分析
    maven工具的配置和使用
    聚类分析方法(二)
  • 原文地址:https://blog.csdn.net/piaomiao_/article/details/138157493