Java经典设计模式之模板方法模式定义与用法示例

 更新时间:2017年08月10日 09:00:35   作者:迟做总比不做强  
这篇文章主要介绍了Java经典设计模式之模板方法模式,简单说明了模板方法模式的原理、定义,并结合实例形式分析了java模板方法模式的具体使用方法,需要的朋友可以参考下

本文实例讲述了Java设计模式之模板方法模式。分享给大家供大家参考,具体如下:

我们在生活中,很多事情都包含特定的一些步骤。如去银行办理业务,通常步骤的次序是:取号 –> 填单 –> 等待叫号–>办理业务。这几个步骤中,有的是不变的,比如取号,每个人都要取,但有的是要变的,比如都有填单,但是根据不同的业务,填写的单据不同。又比如我们外出吃饭,一般的步骤是:点餐–>等待–>吃饭–>付钱,也能发现同样的规律。这样的事情数不胜数。

项目开发中,也可能遇到这样的情况,多个功能模块,可能有相似或相同的操作步骤,只是其中某一环节或某一个步骤不相同,我们就可以抽取一个或多个公用的父类(模板),让子类实现具体的方法。我们以去银行办理业务为例:

模拟抽象类:

/**
* 模板方法模式的模板框架(以去银行办理业务为例)
* @description:
*/
public abstract class TempletBankFrame {
/* 比如:去柜台办理银行卡业务* */
public final void handleBankCard() {
/* 第一步:进入银行大厅取号* */
takeNumber();
/* 第二步:填写办理业务的相关单据* */
if(!isNeedThisMethod()){//特殊情况可以添加判断,如我之前有填写好单子,那今天就不必再填写了
writeBill();
}
/* 第三步:等待工作人员叫号* */
waitCall();
/* 第四步:办理业务* */
handleCard();
}
/* 取号步骤是不需要更改的,所以我们用private修饰* */
private void takeNumber() {
  System.out.println("办理银行业务请取号!");
}
/* 办理的业务不同,填写的内容不同,所以我们用protected修饰,让子类去处理具体业务* */
protected abstract void writeBill();
/* 等待叫号步骤也是不需要更改的,所以我们用private修饰* */
private void waitCall() {
  System.out.println("办理银行业务请取号!");
}
/* 办理的业务不同,用protected修饰,让子类去处理具体业务* */
protected abstract void handleCard();
/*定义一个钩子方法:由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。**/
protected abstract boolean isNeedThisMethod();
}

具体实现类:如办理取钱

/**
* 办理取钱业务
* @description:
*/
public class GetMoney extends TempletBankFrame {
@Override
protected void writeBill() {
  System.out.println("我在填写取钱的单据!");
}
@Override
protected void handleCard() {
  System.out.println("我要取500万大洋");
}
@Override
protected boolean isNeedThisMethod() {
  System.out.println("我已经填写过单子,今天就直接等待叫号了吧!");
  return true;
}
}

具体实现类:如我是去办银行卡

/**
* 办理银行卡
* @description:
*/
public class TackCard extends TempletBankFrame {
@Override
protected void writeBill() {
  System.out.println("我填写的是办理银行卡单据");
}
@Override
protected void handleCard() {
  System.out.println("我在办卡,即将完成!");
}
@Override
protected boolean isNeedThisMethod() {
  return false;
}
}

测试类

/**
* 模板方法模式测试类
* @description:
*/
public class Test {
public static void main(String[] args) {
GetMoney money=new GetMoney();
money.handleBankCard();//调用模板中的办理业务方法
System.out.println("———–分隔线—————-");
TackCard card=new TackCard();
card.handleBankCard();
}
}

最后的输出结果:

办理银行业务请取号!
我已经填写过单子,今天就直接等待叫号了吧!
办理银行业务请取号!
我要取500万大洋
———–分隔线—————-
办理银行业务请取号!
我填写的是办理银行卡单据
办理银行业务请取号!
我在办卡,即将完成!

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java发送带html标签内容的邮件实例代码

    Java发送带html标签内容的邮件实例代码

    下面小编就为大家带来一篇Java发送带html标签内容的邮件实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • java语法糖之jdk迭代的新特性汇总

    java语法糖之jdk迭代的新特性汇总

    什么是语法糖?泛型、自动装箱拆箱、变长参数、增强for循环、switch字符类型、lambda表达式等,这些其实都是语法糖。这篇文章主要给大家介绍了关于java语法糖之jdk迭代的新特性的相关资料,需要的朋友可以参考下
    2021-05-05
  • JAVA spark创建DataFrame的方法

    JAVA spark创建DataFrame的方法

    这篇文章主要介绍了JAVA spark创建DataFrame的方法,帮助大家更好的理解和学习spark,感兴趣的朋友可以了解下
    2020-08-08
  • Java 实现贪吃蛇游戏的示例

    Java 实现贪吃蛇游戏的示例

    这篇文章主要介绍了Java 如何实现贪吃蛇游戏,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • springboot切面添加日志功能实例详解

    springboot切面添加日志功能实例详解

    在本篇文章里小编给大家整理的是关于springboot 切面添加日志功能的相关知识点内容,有需要的朋友们可以参考下。
    2019-09-09
  • Swagger实现动态条件注入与全局拦截功能详细流程

    Swagger实现动态条件注入与全局拦截功能详细流程

    这篇文章主要介绍了Swagger实现动态条件注入与全局拦截功能详细流程,Swagger 可以提供 API 操作的测试文档,本文记录 Swagger 使用过程中遇到的小问题
    2023-01-01
  • spring boot Rabbit高级教程(最新推荐)

    spring boot Rabbit高级教程(最新推荐)

    RabbitMQ的消息过期是基于追溯方式来实现的,也就是说当一个消息的TTL到期以后不一定会被移除或投递到死信交换机,而是在消息恰好处于队首时才会被处理,本篇文章给大家介绍spring boot Rabbit高级教程,感兴趣的朋友一起看看吧
    2023-10-10
  • SpringBoot--Banner的定制和关闭操作

    SpringBoot--Banner的定制和关闭操作

    这篇文章主要介绍了SpringBoot--Banner的定制和关闭操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2018-05-05
  • Java之打印String对象的地址

    Java之打印String对象的地址

    这篇文章主要介绍了Java之打印String对象的地址,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Spring Batch批处理框架使用解析

    Spring Batch批处理框架使用解析

    这篇文章主要介绍了Spring Batch批处理框架使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论