Java设计模式之浅谈模板方法模式

Java设计模式之浅谈模板方法模式

什么是模板方法模式?

模板方法模式(Template Method Pattern)是一种行为型设计模式,它将一个算法的森步骤封装到一个抽象类中,并且使用一组抽象方法定义规定了算法的框架结构,从而使得算法的具体实现延迟到子类中去实现。模板方法是一种简单但是非常实用的模式,因为它把不变项与变化项隔离开来,提高了代码的可复用性和维护性。

模板方法模式的组成

抽象类(Abstract Class)

抽象类定义了模板方法的骨架,其中包含了一个处理流程和其他一些方法(通常是抽象方法、具体方法和钩子方法),这些方法将交由子类来完成。

具体子类(Concrete Class)

具体子类通过继承抽象类,来完成其中定义的不同实现方法,同时可以添加新的方法。

示例1:冲调用饮料

具体场景:做一杯饮料,有咖啡和茶两种选择,而不同的咖啡和茶的冲泡方法也各不相同。

首先,我们定义一个抽象类Beverage,其中定义了模板方法prepareBeverage(),其中包含了两个具体方法boilWater()pourInCup()以及一些抽象方法brew()addCondiments()

public abstract class Beverage {
    // 模板方法
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 公共方法
    public void boilWater() {
        System.out.println("Boiling water...");
    }

    // 公共方法
    public void pourInCup() {
        System.out.println("Pouring the beverage into cup...");
    }

    // 抽象方法
    public abstract void brew();

    // 抽象方法
    public abstract void addCondiments();
}

接下来,我们定义咖啡和茶的具体子类,继承自抽象类Beverage,完成其抽象方法,并可添加自己的方法。

具体子类Coffee

public class Coffee extends Beverage {
    // 具体实现方法
    public void brew() {
        System.out.println("Brewing coffee...");
    }

    // 具体实现方法
    public void addCondiments() {
        System.out.println("Adding sugar and milk...");
    }

    // 新增方法
    public void stir() {
        System.out.println("Stirring...");
    }
}

具体子类Tea

public class Tea extends Beverage {
    // 具体实现方法
    public void brew() {
        System.out.println("Brewing tea...");
    }

    // 具体实现方法
    public void addCondiments() {
        System.out.println("Adding lemon...");
    }

    // 新增方法
    public void steep() {
        System.out.println("Steeping...");
    }
}

最后,测试类TemplateMethodDemo,创建具体实例,调用其模板方法prepareBeverage()即可。

public class TemplateMethodDemo {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        System.out.println("Making coffee...");
        coffee.prepareBeverage();
        ((Coffee) coffee).stir();

        Beverage tea = new Tea();
        System.out.println("Making tea...");
        tea.prepareBeverage();
        ((Tea) tea).steep();
    }
}

输出结果:

Making coffee...
Boiling water...
Brewing coffee...
Pouring the beverage into cup...
Adding sugar and milk...
Stirring...
Making tea...
Boiling water...
Brewing tea...
Pouring the beverage into cup...
Adding lemon...
Steeping...

示例2:银行开户流程

具体场景:银行开户流程,分为五个步骤:填写申请表、审核申请、审批通过、填写合同并签署、完成银行卡发放。

首先,定义一个抽象类Account,其中定义了模板方法openAccount(),其中包含了四个具体方法以及一个抽象方法fillApplication()

public abstract class Account {
    // 模板方法
    public final void openAccount() {
        fillApplication();
        checkApplication();
        approveApplication();
        writeContract();
        issueCard();
    }

    // 具体实现方法
    public void checkApplication() {
        System.out.println("Checking the application...");
    }

    // 具体实现方法
    public void approveApplication() {
        System.out.println("Approving the application...");
    }

    // 具体实现方法
    public void writeContract() {
        System.out.println("Writing the contract and signing...");
    }

    // 具体实现方法
    public void issueCard() {
        System.out.println("Issuing the bank card...");
    }

    // 抽象方法
    public abstract void fillApplication();
}

接下来,我们定义不同种类的银行账号,如储蓄账户和信用卡账户,在继承抽象类Account的基础上实现其中的抽象方法(填写申请表fillApplication())。

储蓄账户SavingAccount

public class SavingAccount extends Account {
    // 实现抽象方法
    public void fillApplication() {
        System.out.println("Filling the application for saving account...");
    }
}

信用卡账户CreditAccount

public class CreditAccount extends Account {
    // 实现抽象方法
    public void fillApplication() {
        System.out.println("Filling the application for credit account...");
    }
}

最后,测试类TemplateMethodDemo,创建具体实例,调用其模板方法openAccount()即可。

public class TemplateMethodDemo {
    public static void main(String[] args) {
        Account savingAccount = new SavingAccount();
        System.out.println("Opening a saving account...");
        savingAccount.openAccount();

        Account creditAccount = new CreditAccount();
        System.out.println("Opening a credit account...");
        creditAccount.openAccount();
    }
}

输出结果:

Opening a saving account...
Filling the application for saving account...
Checking the application...
Approving the application...
Writing the contract and signing...
Issuing the bank card...
Opening a credit account...
Filling the application for credit account...
Checking the application...
Approving the application...
Writing the contract and signing...
Issuing the bank card...

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

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • R7-5800H和R7-5800U哪款好 R7-5800H和R7-5800U对比评测

    R7-5800H和R7-5800U哪款好 简介 R7-5800H和R7-5800U都是AMD Ryzen 7系列的处理器,它们在性能和功耗方面有所不同。了解它们的特点和区别,可以帮助你选择适合自己需求的处理器。 R7-5800H R7-5800H是一款面向高性能笔记本电脑的处理器。它采用了AMD的Zen 3架构,拥有8个核心和16个线程。它的主频为3.2 G…

    other 2023年8月5日
    00
  • mac系统如何配置adb

    Mac系统如何配置ADB ADB是Android Debug Bridge的缩写,是Android开发工具中一个非常核心的部分。ADB可以用来连接和控制Android设备,进行文件传输和调试等操作。本文将简单介绍如何在Mac系统中配置并使用ADB。 1. 安装Android SDK 在使用ADB之前,我们需要安装Android SDK。Android SDK…

    其他 2023年3月29日
    00
  • 解析从小程序开发者工具源码看原理实现

    这里我将详细讲解解析从小程序开发者工具源码看原理实现的完整攻略。 前言 如今,小程序已经成为了移动互联网的一个重要组成部分,而小程序开发者工具则是小程序开发的必备工具。对于一个开发者而言,了解小程序开发者工具的原理实现,将有助于更好地了解小程序的开发和调试。 步骤 以下为从小程序开发者工具源码看原理实现的攻略步骤: 1. 下载开发者工具源码 可以从小程序官网…

    other 2023年6月26日
    00
  • hp-socket快速入门:分包、粘包解析

    下面是HP-Socket快速入门:分包、粘包解析的完整攻略。 1.前言 在使用HP-Socket进行开发时,我们经常会遇到TCP协议在通信过程中会出现粘包、拆包问题。为了解决这个问题,我们必须在代码中进行处理。本文将详细讲解如何使用HP-Socket处理TCP粘包、拆包的问题。 2.分包处理 分包是指将TCP数据进行分开传输,以解决TCP粘包问题。下面我们就…

    其他 2023年4月16日
    00
  • 聊聊Golang的语言结构和变量问题

    当涉及到Golang的语言结构和变量问题时,以下是一个完整的攻略,其中包含两个示例说明。 … … 语言结构 Golang是一种静态类型、编译型的编程语言,具有简洁、高效和并发性强的特点。以下是一些关于Golang语言结构的要点: Golang程序由包(package)组成,每个文件都属于一个包。 … 每个包可以包含多个函数(function)。 …

    other 2023年8月10日
    00
  • php打开另一个网页

    PHP打开另一个网页 有时候,您的 PHP 程序需要打开另一个网页,例如在需要跳转到另一个网页时,您需要使用 PHP 来完成此操作。本文将介绍如何使用 PHP 打开另一个网页。 使用header()函数打开网页 您可以使用 header() 函数来实现打开一个新的网页。header() 函数用于向客户端发送原始的 HTTP 报头。例如,在下面的示例中,我们将…

    其他 2023年3月29日
    00
  • jquery跟js初始化加载的多种方法及区别介绍

    针对题目“jquery跟js初始化加载的多种方法及区别介绍”的完整攻略,我准备了以下内容,并进行了分条详解。 一、jQuery和JS的初始化 1. jQuery的初始化 jQuery的初始化可以通过选择要操作的元素,然后在其中进行相关操作。例如: $(document).ready(function(){ //放置需要在DOM全部满足之后执行的代码 }); …

    other 2023年6月20日
    00
  • 压力测试工具——jmeter

    压力测试工具——jmeter 1. 什么是jmeter Apache JMeter是一个纯Java应用程序,用于性能测试和基准测试Web应用程序,进行负载测试,功能测试和压力测试。 2. jmeter能做什么 JMeter能够以不同的方式测试不同类型的应用程序,例如:- web应用程序:HTTP, HTTPS (Java, NodeJS, PHP, ASP.…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部