Java设计模式之模板方法详解

Java设计模式之模板方法详解

什么是模板方法

模板方法模式是一种行为设计模式,它在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得可以在不改变算法结构的情况下重定义算法的某些步骤。

模板方法的实现

在Java中实现模板方法,需要按照以下步骤:

  1. 创建一个抽象类,定义一个模板方法(如templateMethod())作为算法的骨架,并包含其他的具体方法(如methodA()methodB()等);
  2. 在模板方法中调用具体方法,这些具体方法需要在子类中实现;
  3. 创建子类,实现抽象类中定义的抽象方法(如methodA()methodB()等)。

示例说明

下面通过两个简单的示例来演示模板方法的应用。

示例一

假设我们要编写一个能计算一个数列的和的程序。首先我们定义一个抽象类Sequence,并在其中实现一个模板方法sum()

public abstract class Sequence {
    private List<Integer> data = new ArrayList<>();

    public Sequence(int... nums) {
        for (int num : nums) {
            this.data.add(num);
        }
    }

    protected List<Integer> getData() {
        return this.data;
    }

    public final int sum() {
        int sum = 0;
        for (int num : getData()) {
            sum += num;
        }
        return sum;
    }

    public abstract int length();
}

Sequence类中,我们定义了一个List<Integer>类型的数据成员data,并将它的值作为构造函数的参数初始化。同时,我们定义了一个sum()方法作为模板方法,用于计算数列中所有数字的总和。在模板方法中,我们调用了一个需要在子类中实现的方法getData(),用于获取数列数据。另外,在抽象类中,我们还定义了一个抽象方法length(),该方法需要在子类中实现。接下来,我们创建一些子类,如IntSequenceDoubleSequence,并实现抽象方法length(),并构造对应的数列。如下:

public class IntSequence extends Sequence {
    public IntSequence(int... nums) {
        super(nums);
    }

    @Override
    public int length() {
        return getData().size();
    }
}

public class DoubleSequence extends Sequence {
    public DoubleSequence(double... nums) {
        super();
        for (double num : nums) {
            this.getData().add((int) num);
        }
    }

    @Override
    public int length() {
        return getData().size();
    }
}

在子类中,我们实现了抽象方法length(),并且分别使用数组初始化了IntSequenceDoubleSequence,并将它们传递给抽象类的父类构造函数。最后,我们可以如下方式调用数列中所有数字的总和:

IntSequence nums1 = new IntSequence(1, 2, 3, 4, 5);
DoubleSequence nums2 = new DoubleSequence(1.1, 2.2, 3.3, 4.4, 5.5);
System.out.println("IntSequence sum = " + nums1.sum());
System.out.println("DoubleSequence sum = " + nums2.sum());

示例二

假设我们要编写一个银行利息计算器。首先我们定义一个抽象类BankAccount,并在其中实现一个模板方法calculateInterest()

public abstract class BankAccount {
    private double balance;

    public BankAccount(double balance) {
        this.balance = balance;
    }

    public final double calculateInterest() {
        double rate = getRate();
        double interest = balance * rate;
        interest = ((int) (interest * 100)) / 100.0;
        return interest;
    }

    public abstract double getRate();
}

BankAccount类中,我们定义了一个double类型的数据成员balance,并将它的值作为构造函数的参数初始化。同时,我们定义了一个calculateInterest()方法作为模板方法,用于计算银行利息。在模板方法中,我们调用了一个需要在子类中实现的方法getRate(),用于获取银行利率。接下来,我们创建一些子类,并分别实现抽象方法getRate()

public class SavingsAccount extends BankAccount {
    public SavingsAccount(double balance) {
        super(balance);
    }

    @Override
    public double getRate() {
        return 0.05;
    }
}

public class CheckingAccount extends BankAccount {
    public CheckingAccount(double balance) {
        super(balance);
    }

    @Override
    public double getRate() {
        return 0.01;
    }
}

在子类中,我们实现了抽象方法getRate(),并且分别使用余额初始化了SavingsAccountCheckingAccount。最后,我们可以如下方式调用银行利息计算器:

SavingsAccount savings = new SavingsAccount(10000);
CheckingAccount checking = new CheckingAccount(10000);
System.out.println("savings interest = " + savings.calculateInterest());
System.out.println("checking interest = " + checking.calculateInterest());

总结

模板方法模式是一种很好的设计模式,它使得能够在不改变算法结构的情况下重定义算法的某些步骤。我们可以通过继承自定义具体实现,从而实现了程序的扩展性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之模板方法详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • SpringBoot集成FastDFS+Nginx整合基于Token的防盗链的方法

    下面是 SpringBoot 集成 FastDFS+Nginx 整合基于 Token 的防盗链的方法的完整攻略: 简介 FastDFS 是一个开源的分布式文件系统,由阿里巴巴的余庆编写,目前由开源社区进行开发,FastDFS 是基于 Linux 的文件系统,实现了一个简单的文件系统,它是以 Tracker Server 和 Storage Server 为两…

    Java 2023年5月20日
    00
  • 如何解决struts2日期类型转换

    解决struts2日期类型转换问题的完整攻略如下: 问题描述 在使用struts2框架中,如果后台 Action 接收的参数是日期类型,容易出现类型转换异常。例如,在前端页面中,日期类型通常采用字符串格式传递,如“2019-10-01”,但是在后台 Action 中,需要将该字符串转换为日期类型对象,否则无法正确处理业务逻辑。如果日期格式不一致,将会出现类型…

    Java 2023年6月2日
    00
  • SpringBoot–Banner的定制和关闭操作

    关于SpringBoot的Banner定制和关闭操作,下面是我的攻略: 什么是Banner 在介绍Banner的定制和关闭操作之前,我们先来了解一下什么是Banner。在SpringBoot应用程序启动的时候,会输出一个默认的Banner,它是一张ascii字符组成的图案,可以设置不同的颜色、字体、大小等属性,用于展示应用程序的信息,例如名称、版本、版权信息…

    Java 2023年5月19日
    00
  • Mybatis 插入和删除批处理操作

    对于“Mybatis插入和删除批处理操作”的完整攻略,可以分为以下几个步骤: 1.配置Mybatis的批处理模式2.编写插入和删除的SQL语句3.使用SqlSession进行批量操作 下面对每一步进行详细的讲解。 1.配置Mybatis的批处理模式 在Mybatis配置文件中,添加以下属性来开启批处理模式。 <configuration> &lt…

    Java 2023年5月19日
    00
  • IDEA工程运行时总是报xx程序包不存在实际上包已导入(问题分析及解决方案)

    问题背景 在使用 JetBrains 旗下的 Java IDE 工具 IntelliJ IDEA 进行项目开发时,有时会遇到一个问题:在导入了某些依赖库后,运行程序时提示某些类找不到或某些程序包不存在,但实际上这些包已经被正确导入了。 问题原因 这是因为 IntelliJ IDEA 默认会在编译、运行时根据 Maven、Gradle 或自己所设置的依赖路径自…

    Java 2023年5月26日
    00
  • 详解JNI到底是什么

    JNI全称为Java Native Interface,是Java语言与其他编程语言(如C、C++)进行交互的接口。JNI可以使Java程序通过调用本地(C、C++)编写的程序,实现高效的、与操作系统直接交互的功能。下面详细讲解JNI到底是什么,让你对JNI有更深刻的理解和认识。 什么是JNI? JNI是Java的一部分,是Java语言本身提供的一个开发工具…

    Java 2023年5月26日
    00
  • java application maven项目打自定义zip包实例(推荐)

    下面是“Java Application Maven项目打自定义zip包实例”的详细攻略。 简述 在程序的开发过程中,通常需要将代码及其附属资源打包为可执行的程序或库,并进行发布和分发。Maven是一个非常流行的Java包管理工具,可以通过Maven来打包生成自定义的zip包。 步骤 创建Maven项目 首先需要创建一个简单的Maven项目。使用Maven …

    Java 2023年5月20日
    00
  • 使用Spring Security OAuth2实现单点登录

    使用Spring Security OAuth2实现单点登录的完整攻略如下: 1. 概述 OAuth(Open Authorization)是一个标准的身份验证和授权协议,OAuth2是OAuth协议的下一个版本。OAuth2基于授权访问所有类型的应用程序,通过集中授权服务器授权用户访问受保护的资源。在实际应用中,OAuth2通常用来实现单点登录(SSO)的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部