模板设计模式

定义

  • 模板模式是行为型设计模式。
  • 在一个算法流程或者执行流程里,把一系列公共不会变动的算法提取出来。把需要改动的一块代码抽象出来交给子类去重写。通俗的讲就是很多相同步骤的流程里,可能在某个步骤里存在差别。例如在《大话设计模式》中提到的考试场景模式,学生们的试卷都是一样的,只是学生回答的答案不一样,这种场景就适合使用模板模式。

代码实现

/**
 * 模板抽象类
 *
 * @Author: ZRH
 * @Date: 2021/2/9 11:39
 */
public abstract class AbstractPaper {

    /**
     * 不可变的执行流程模板方法
     */
    public final void templateMethod() {
        System.err.println("问题A :xxx***xxx***?");
        abstractAnswerA();
        System.err.println("问题B :xxx***xxx***?");
        abstractAnswerB();
        System.err.println("问题C :xxx***xxx***?");
        abstractAnswerC();
    }

    /**
     * 抽象答案方法
     */
    public abstract void abstractAnswerA();

    /**
     * 抽象答案方法
     */
    public abstract void abstractAnswerB();

    /**
     * 抽象答案方法
     */
    public abstract void abstractAnswerC();
}
/**
 * 模板方法
 *
 * @Author: ZRH
 * @Date: 2021/2/9 11:47
 */
public class TemplateUserA extends AbstractPaper {

    @Override
    public void abstractAnswerA() {
        System.err.println("问题A的答案是 A");
    }

    @Override
    public void abstractAnswerB() {
        System.err.println("问题B的答案是 B");
    }

    @Override
    public void abstractAnswerC() {
        System.err.println("问题C的答案是 C");
    }
}
    /**
     * 测试模板方法
     * @param args
     */
    public static void main(String[] args) {

        new TemplateUserA().templateMethod();
    }
问题A :xxx***xxx***?
问题A的答案是 A
问题B :xxx***xxx***?
问题B的答案是 B
问题C :xxx***xxx***?
问题C的答案是 C

使用场景和优劣势

  • 模板模式是实际项目或源码中使用非常多的一种设计模式,例如spring的JdbcTemplate,事务管理器AbstractPlatformTransactionManager,MVC控制器等等。还有根据项目业务需求也可以且容易使用模板模式。
  • 优点 :在其父类提取了公共不变的算法模板, 其子类扩展了可变化算法流程,提高了代码复用性。符合对修改关闭,对扩展开发的原则。
  • 缺点 :每个不同的实现都需要增加子类,提升了代码复杂度,项目类数量增加也会加大JVM类加载负荷。父类的抽象方法依赖子类的实现,所以父类的执行结果依赖于子类执行结果,这种结构提升了代码阅读的困难性。

和策略模式的区别

  • 策略模式类之间关系多用组合/实现,少用继承。而模板模式中算法类使用继承方式。
  • 策略模式注重策略实现类的组织和调用。而模板模式注重模板类中模板方法的实现。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的模板设计模式是一种行为型设计模式,它允许我们定义一个算法的骨架,但允许子类为其中的一些步骤提供具体的实现。 模板设计模式由两个主要组件组成: 1. 抽象类(Abstract Class):它定义了一个模板方法,该方法提供了算法的骨架。它可以包含一个或多个抽象方法,这些方法由子类来实现。 2. 具体类(Concrete Class):它是抽象类的子类,负责实现抽象方法。 以下是一个示例代码来说明模板设计模式的用法: ```java public abstract class AbstractClass { // 模板方法 public final void templateMethod() { // 步骤一 stepOne(); // 步骤二 stepTwo(); // 步骤三 stepThree(); } // 抽象方法,由子类实现 protected abstract void stepOne(); protected abstract void stepTwo(); // 钩子方法,子类可以选择性地覆盖 protected void stepThree() { // 默认实现 } } public class ConcreteClass extends AbstractClass { @Override protected void stepOne() { // 具体实现步骤一 } @Override protected void stepTwo() { // 具体实现步骤二 } } ``` 在上面的示例中,`AbstractClass` 是抽象类,它定义了一个名为 `templateMethod()` 的模板方法,并声明了三个抽象方法 `stepOne()`、`stepTwo()` 和 `stepThree()`。`ConcreteClass` 是具体类,它继承了 `AbstractClass` 并实现了抽象方法。 通过使用模板设计模式,我们可以在抽象类中定义算法的骨架,而具体的实现可以由子类来完成。这种设计模式使得代码重用和扩展变得更加容易。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值