JAVA设计模式之模板方法模式

Java 设计模式之模板方法

1. 定义

  1. 一个算法骨架,并允许子类提供一个或者多个步骤实现、
  2. 模板方法使得子类在不改变算法结构的情况下,重新定义算法的某些步骤

2. 类型

行为型

3. 模板方法的适用场景

  1. 一次性实行算法不变的部分,并将可变的行为留给子类来实现
  2. 各个子类公共的部分被提取出来并集中到一个公共父类中,从而避免代码重复

4. 优点

  1. 提高复用性
  2. 提高扩展性
  3. 符合开闭原则

5. 缺点

  1. 类数目增加
  2. 增加了系统实现的复杂度
  3. 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

6. 模板方法-扩展

  1. 钩子方法

7. 相关设计模式

  1. 模板方法和工厂方法

    模板方法是工厂方法的一种特殊实现

  2. 模板方法和策略方法

    策略模式 使不同的算法相互替换

8. coding

8.1 抽象接口

public abstract class ICourse {

    protected final void makeCourse() {
          this.makePPT();
          this.makeVideo();
          if (this.isNeedArticle()){
              this.makeArticle();
          }

          this.packageCourse();
    }

    final void makePPT() {

        System.out.println("制作PPT");
    }

    final void makeVideo() {
        System.out.println("制作视频");
    }

    final void makeArticle() {
        System.out.println("制作手记");
    }

    protected Boolean isNeedArticle() {
        return false;
    };

    abstract void packageCourse();
}

8.2 抽象接口子类

public class JavaCourse extends ICourse{
    @Override
    void packageCourse() {
        System.out.println("JAVA 课程");
    }

    @Override
    protected Boolean isNeedArticle() {
        return true;
    };
}
public class JavaScriptCourse extends ICourse{
    @Override
    void packageCourse() {
        System.out.println("javaScript 课程");
    }
}

8.3 实现类

public class Test {

    public static void main(String[] args) {

        System.out.println("制作JAVA课程开始 start");
        ICourse course = new JavaCourse();
        course.makeCourse();
        System.out.println("制作JAVA课程开始 end");

        System.out.println("制作JAVASCROIPT课程开始 start");
        ICourse javaCourse = new JavaScriptCourse();
        javaCourse.makeCourse();
        System.out.println("制作JAVASCROIPT课程开始 end");
    }
}

模板方法起到保护作用,抽象保护的方法,已到达模板条件不一样的想过

9. 源码解析

9.1 AbstractList

 abstract public E get(int index);

9.2 HttpServlet

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_get_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }

9.3 BaseExecutor

  protected void closeStatement(Statement statement) {
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException var3) {
            }
        }

    }

10. UML

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ahhqjhm3-1667318793028)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221102000615153.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值