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

yizhihongxing

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日

相关文章

  • U盘内容还是无法显示但却占内存的多种解决方法

    U盘内容无法显示但占内存的解决方法攻略 如果你的U盘无法显示内容但却占用了内存空间,可能是由于文件系统损坏、病毒感染或者其他问题导致的。下面是一些解决方法,希望能帮助你解决这个问题。 方法一:修复文件系统 插入U盘并等待系统识别。 打开“我的电脑”或“此电脑”,找到U盘的驱动器。 右键点击U盘驱动器,选择“属性”。 在“工具”选项卡下,点击“错误检查”。 在…

    other 2023年8月1日
    00
  • Linux Shell脚本系列教程(六):数组和关联数组

    让我给您详细讲解一下“Linux Shell脚本系列教程(六):数组和关联数组”的完整攻略。 一、数组 1. 数组的定义 定义数组的方式有两种: 类似于C语言的定义方式:array_name=(value1 value2 value3 …) 类似于Python的定义方式:array_name=([0]=value1 [1]=value2 [2]=valu…

    other 2023年6月25日
    00
  • macroot用户初始密码设置

    MacRoot用户初始密码设置 如果您是一位MacRoot用户,那么初次登录时需要设置初始密码,以确保安全性。在这篇文章中,我们将为您提供如何设置自己的MacRoot用户初始密码的详细指南。 步骤1:打开终端 要设置MacRoot用户的密码,首先需要打开您的Mac上的终端。您可以通过按下“ Command + 空格”组合键打开Spotlight搜索,然后输入…

    其他 2023年3月29日
    00
  • 10多个下载photo shop brushes的最佳网站

    以下是关于“10多个下载Photoshop刷子的最佳网站”的完整攻略,包括基本知识和两个示例说明。 基本知识 Photoshop刷子是一种用于Photoshop软件的工具,它可以帮助用户快速添加各种效果和纹理到他们的设计中。Photoshop刷子可以通过下载和安装来扩展Photoshop的功能。 以下是一些下载Photoshop刷子的最佳网站: Brushe…

    other 2023年5月7日
    00
  • 面试分析分布式架构Redis热点key大Value解决方案

    针对“面试分析分布式架构Redis热点key大Value解决方案”的问题,我将提供一些完整的攻略。 1. 什么是热点key? 在Redis中,热点key是指经常被访问的键。当一个键被频繁访问时,这个键就成为了热点key。热点key可能会造成Redis节点的性能问题,影响Redis集群的整体性能。 2. 什么是大value? 在Redis中,值可以是任何值,包…

    other 2023年6月26日
    00
  • 01python基础数据类型

    01python基础数据类型 Python是一门高级编程语言,提供了很多基础数据类型用于操作数据。在本篇文章中,我们将着重介绍Python的基础数据类型:数字、字符串、列表、元组、字典和集合。 数字 Python中有三种数字类型:整数、浮点数和复数。其中,整数即为常见的整数,浮点数则包括带有小数点的数字。 为了方便开发,Python支持多种数字进制表示方式。…

    其他 2023年3月29日
    00
  • 微信QQ如何制作自定义个性化通知铃声?自定义QQ个性提示音

    制作自定义个性化通知铃声的攻略如下: 步骤一:准备音频素材 制作自定义通知铃声需要先准备好音频素材。可以在网上下载自己喜欢的铃声,或者自己录制音频。需要注意的是,铃声长度不要超过30秒,文件格式为mp3格式。 步骤二:将铃声上传到网盘 将制作好的铃声上传到网盘中,这样可以方便地在多个设备之间同步使用自定义通知铃声。建议使用百度网盘或者腾讯微云等大型网盘。 步…

    other 2023年6月25日
    00
  • win10 eclipse配置环境变量的教程图解

    下面就是针对“win10 eclipse配置环境变量的教程图解”的完整攻略。 环境变量的作用 环境变量是在操作系统中用来设置系统级参数和用户级参数的一种方法。在Windows操作系统中,每个环境变量都对应一个值,通过设置环境变量来在系统中使用某些程序、工具或库。 在配置Eclipse开发环境时,配置JAVA_HOME和Path两个系统级环境变量是必不可少的。…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部