• 设计模式 - 行为型模式考点篇:模板方法模式(概念 | 案例实现 | 优缺点 | 使用场景)


    目录

    一、行为型模式

    1.1、模板方法模式

    1.1.1、概念

    1.1.2、案例实现

    1.1.3、优缺点

    1.1.4、使用场景


    一、行为型模式


    一句话概括行为型模式

    行为型模式:类或对象间如何交互、如何划分职责,从而更好的完成任务.

    1.1、模板方法模式

    1.1.1、概念

    在一个算法骨架中,将某些算法的步骤延迟倒子类中,使得这些算法的可以根据具体的环境实现.

    这就像是,我们在设计一个程序的时候经常可能会遇到这种情况:“设计了一个算法步骤,确定了这些步骤的执行顺序,但其中某些步骤还是未知,需要根据具体的业务情况而定”,此时就可以使用模板方法模式,使其放到子类实现.

    例如,炒菜的步骤时固定的,分为倒油、热油、倒入要炒食物、倒调料、翻炒这几个步骤,其中 倒油、热油、翻炒这几个步骤是固定的,而炒什么食物 和 倒调料 都是要根据情况而定的.

    模板方法模式包含角色:

    • 抽象类:给出一套算法的具体实现和执行顺序,其中包含一些在子类中实现的抽象方法.
    • 具体子类:实现抽象类中定义的抽象方法,他们也是算法执行逻辑的组成步骤.

    1.1.2、案例实现

    例如上述炒菜案例.

    1. /**
    2. * 抽象类: 做菜类
    3. */
    4. public abstract class DoCooking {
    5. public void doCooking() {
    6. //1.倒油
    7. pourOil();
    8. //2.热油
    9. hotOil();
    10. //3.倒食物
    11. pourFood();
    12. //4.添加调料
    13. addSeasoning();
    14. //5.翻炒
    15. fry();
    16. }
    17. private void pourOil() {
    18. System.out.println("倒油");
    19. }
    20. private void hotOil() {
    21. System.out.println("热油");
    22. }
    23. /**
    24. * 添加食物
    25. */
    26. protected abstract void pourFood();
    27. /**
    28. * 添加调料
    29. */
    30. protected abstract void addSeasoning();
    31. private void fry() {
    32. System.out.println("翻炒");
    33. }
    34. }
    1. /**
    2. * 具体子类: 处理鸡蛋
    3. */
    4. public class HandlerEgg extends DoCooking {
    5. @Override
    6. protected void pourFood() {
    7. System.out.println("将鸡蛋下锅");
    8. }
    9. @Override
    10. protected void addSeasoning() {
    11. System.out.println("添加酱油");
    12. }
    13. }
    1. /**
    2. * 具体子类: 处理米饭
    3. */
    4. public class HandlerRice extends DoCooking {
    5. @Override
    6. protected void pourFood() {
    7. System.out.println("将米饭下锅");
    8. }
    9. @Override
    10. protected void addSeasoning() {
    11. System.out.println("添加葱花");
    12. }
    13. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. //1.炒鸡蛋
    4. HandlerEgg egg = new HandlerEgg();
    5. egg.doCooking();
    6. System.out.println("===================");
    7. //2.炒米饭
    8. HandlerRice rice = new HandlerRice();
    9. rice.doCooking();
    10. }
    11. }

    执行结果如下:

    1.1.3、优缺点

    优点:

    提高代码复用性:将相同代码放到抽象的父类中,不同实现放到不同子类中.

    符合开闭原则:将来如果增加一个相关业务吗,只需要扩展实现一个子类,无需修改原有代码.

    缺点:

    增加系统复杂度:每一个不同实现都需要定义一个子类,会导致类的数量增加,系统更加庞大.

    1.1.4、使用场景

    1. 算法的整体步骤固定,只有个别容易改变.
    2. 需要通过子类来决定父类算法中的某步骤的具体实现.

  • 相关阅读:
    Flutter循序渐进==>数据结构(列表、映射和集合)和错误处理
    【力扣每日一题】2023.10.19 同积元组
    【计算情与思】扫地僧、打字员、信息恐慌与奥本海默
    了解网络黑客的关键攻击方法
    最短路径算法
    AI的制作思维导图
    [西湖论剑 2022]real_ez_node
    LeetCode - 1700. 无法吃午餐的学生数量
    企业使用CRM会获得什么成效?
    力扣刷题 day37:10-07
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/133716763