设计模式 - 模板方法模式

作用

  • 模板方法模式: 主要实现代码复用和功能扩展;
  • 代码复用: 子类复用模板方法所在类的模板流程;
  • 功能扩展: 由父类(模板方法所在类)定义功能流程, 由子类去实现流程中的具体细节(即每一个具体功能函数).
  • 将具体的功能实现延迟到子类去实现.

使用场景

  1. JUC并发包的AQS类中, Sync实现了AQS的tryAccquire()钩子函数
  2. Servlet的service()方法, 定义了doGet(),doPost()的执行流程, 具体实现放到子类实现;

代码模板

组成1: 模板方法所在类
package TemplateMethod;

/**
 * Instruction:The template of Template Method pattern
 * Author:@author MaLi
 */
public abstract class BaseTemplate {
    // 关键点1:
    // 模板方法, 作用: 定义流程框架
    public final void templateMethod() {
        System.out.println("BaseTemplate - 模板方法开始执行...");
        concreteMethod1();
        concreteMethod2();
        concreteMethod3();
        System.out.println("BaseTemplate - 模板方法执行结束!!!");
    }

    // 关键点2:
    // 功能方法, 作用: 定义具体的细节功能

    // 功能方法实现方式1: 定义为抽象方法, 子类必须继承实现
    protected abstract void concreteMethod1();

    // 功能方法实现方式2: 如果不继承重写, 方法体中抛出异常
    protected void concreteMethod2() {
        throw new UnsupportedOperationException();
    }

    // 功能方法实现方式3: 方法体定义默认缺省实现, 子类根据需要决定是否需要覆盖
    protected void concreteMethod3() {
        System.out.println("BaseTemplate - 默认实现的方法, 可以缺省, 也可以覆盖");
    }
}
组成2: 子类
package TemplateMethod;

/**
 * Instruction:
 * Author:@author MaLi
 */
public class ConcreteClass extends BaseTemplate {
    @Override
    public void concreteMethod1() {
        System.out.println("ConcreteClass - 强制实现的抽象方法");
    }

    @Override
    public void concreteMethod2() {
        System.out.println("ConcreteClass - 不重写就抛出异常的方法");
    }

}
TestCase
package TemplateMethod;

import org.junit.Test;

/**
 * Instruction:
 * Author:@author MaLi
 */
public class TestConcreteClass {
    @Test
    public void testMethod1() {
        //通过多态指向具体子类(不同的实现细节子类)
        BaseTemplate baseTemplate = new ConcreteClass();
        //调用父类的模板方法
        baseTemplate.templateMethod();
    }
}

—> 点击这里: 代码仓库地址

—> 点击这里: Java知识体系文章导航

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能力工场小马哥

如果对您有帮助, 请打赏支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值