Java经典设计模式之模板方法模式定义与用法示例
时间:2019-03-31
本文章向大家介绍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程序设计有所帮助。
- Python 设计模式初探
- 请注意,我们要谈谈神经网络的注意机制和使用方法
- TensorFlow官方教程翻译:导入数据
- TF使用例子-情感分类
- TensorFlow官方教程翻译:TensorFlow调试器
- 深度学习实战 | 使用Kera预测人物年龄
- 竞猜活动区块链方案探索
- 无所谓
- 这是一个悲伤的故事
- Golang语言社区--标准库分析之strconv包
- Golang语言社区--结构体数据排序
- mybatis-plus思维导图,让mybatis-plus不再难懂
- ABAP OPEN SQL里OPEN CURSOR和SELECT的比较
- 如何用ABAP代码读取CDS view association的数据
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 小白学PyTorch | 10 pytorch常见运算详解
- vuex的基础知识点
- 小白学PyTorch | 11 MobileNet详解及PyTorch实现
- 小白学PyTorch | 12 SENet详解及PyTorch实现
- 重拾前端技能为你的职业前程保驾护航
- input切换显示与隐藏,歘~
- 小白学PyTorch | 13 EfficientNet详解及PyTorch实现
- Java 比较两个字符串内容是否相等
- 前端模块化发展史
- 前端性能优化
- 突击并发编程JUC系列-原子更新AtomicLong
- Windows下指定的服务已经标记为删除”
- 《剑指offer》第29天:m x n 网格的最小路径和
- 环保 HJ212协议解析
- Flink源码解读系列 | 任务提交流程