• Java设计模式——模板方法模式


    当你在设计一个业务功能时,有一些方法/算法的结构是固定的,但其中的某些步骤可能会因不同的情境而发生不同的变化。你希望固定核心结构部分,然后灵活的去定制一些特定的步骤。这个时候可以考虑使用模板方法,通过定义一个抽象的父类,其中包含了方法/算法的核心结构,但某些步骤使用抽象方法或受保护的虚拟方法来表示,这些方法由子类来实现。这使得子类可以在不改变核心方法的同时根据需要重写特定的步骤。父类中的模板方法调用这些步骤,确保算法的整体流程一致。

    假定一个网课流程的例子

    1. /**
    2. * 抽象课程
    3. */
    4. public abstract class AbstractCourse {
    5. protected void createPPT() {
    6. System.out.println("制作课件");
    7. }
    8. protected void liveVideo() {
    9. System.out.println("教学直播");
    10. }
    11. protected void postNote() {
    12. System.out.println("上传课堂笔记");
    13. }
    14. protected void postHomeWork() {
    15. System.out.println("布置作业");
    16. }
    17. protected boolean needCheckHomework() {
    18. return false;
    19. }
    20. protected abstract void checkHomework();
    21. public final void createCourse() {
    22. createPPT();
    23. liveVideo();
    24. postNote();
    25. postHomeWork();
    26. if (needCheckHomework()) {
    27. checkHomework();
    28. }
    29. }
    30. }
    31. /**
    32. * java课程
    33. */
    34. @Setter
    35. public class JavaCourse extends AbstractCourse {
    36. private boolean needCheckHomeWork = false;
    37. @Override
    38. protected boolean needCheckHomework() {
    39. return this.needCheckHomeWork;
    40. }
    41. @Override
    42. protected void checkHomework() {
    43. System.out.println("检查Java作业");
    44. }
    45. }
    46. /**
    47. * python课程
    48. */
    49. public class PythonCourse extends AbstractCourse {
    50. @Override
    51. protected void checkHomework() {
    52. System.out.println("检查python作业");
    53. }
    54. }

    编写测试用例

    1. /**
    2. * 模板方法-课程流程测试
    3. */
    4. @Test
    5. public void testTemplateMethod() {
    6. System.out.println("======Java课程======");
    7. JavaCourse javaCourse = new JavaCourse();
    8. javaCourse.setNeedCheckHomeWork(true);
    9. javaCourse.createCourse();
    10. System.out.println("======Python课程======");
    11. PythonCourse pythonCourse = new PythonCourse();
    12. pythonCourse.createCourse();
    13. }

  • 相关阅读:
    多地接连进入汛期,如何做好积水监测站的管理?
    Scrum敏捷开发端到端管理流程
    恶意代码防范技术笔记(五)
    锁升级的实现流程
    搜索引擎算法工程师,在query理解方面,都有哪些方面的工作
    集合注入实例(八)
    微软OneDrive简介:特点、应用场景、使用方法、注意事项
    JPA的注解@Field指定为Keyword失败,导致查询不到数据
    vue.js中使用三元运算符设置动态样式
    hdu 3549 a flow problem 的多种解法
  • 原文地址:https://blog.csdn.net/LittleMangoYX/article/details/136310369