java 模板方法_设计模式(java实现)_模板方法模式(Template method)
设计模式(java实现)_模板方法模式(Template method)
模板方法模式是编程中经常用到到的模式。它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。
核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,可以将该节点的代码实现转移给子类完成。即:处理步骤父类定义好,具体实现延迟到子类中定义,由父类进行整个过程的控制。
使用场景:实现一个算法时,整体步骤很固定,但是某些部分易变。易变部分可以抽象出来,供子类实现。
比如一个场景:
玩氪金手游充钱抽卡的流程。可以确定的是
第一步:打开氪金界面。
第二步:选择氪金。
第三步:选择支付方式。
最后:抽奖。
假设其他流程均为固定,而其中只有选择支付方式这一点可能会有所变化。比如可以用支付宝、微信等等支付。
那么要实现这种需求,每种方式都重复进行一遍编写的话代码太多,过于丑陋。
这时即可使用模板方法模式,将其固定的流程定死,并将选择支付方式声明为抽象,强制子类实现。
代码实现:
氪金的模板方法,可以看见我实现了除【选择支付方式】以外其余所有的方法。并且将流程控制在内部。
子类的权限只够修改除了执行整个氪金流程以外的方法。并且需要强制实现选择支付方式的方法。
package com.skypyb.templateMethod;
/**
* 模板方法模式
*
* @author pyb www.skypyb.com www.yibobo.top
*/
public abstract class RechargeTemplateMethod {
public void entryRechargePage() {
System.out.println("进入充值界面...");
}
public void recharge() {
System.out.println("氪金!");
}
//支付方式,具体的支付方式可能变动。abstract修饰,强制子类重写。
public abstract void modeOfPayment();
public void luckyDraw() {
System.out.println("抽奖,哇又是保底SR");
}
/**
* 模板方法,流程已知。
* 定义好具体的流程加上 final 修饰,使得子类不可重写
* 外部调用必须通过本类进行调用
*/
public final void process(){
this.entryRechargePage();
this.recharge();
this.modeOfPayment();
this.luckyDraw();
}
}
实现其抽象方法的具体类以及客户端调用者:
若实现模板方法的子类并不复杂的话可考虑将其写成匿名内部类。若算法特别复杂并且需要实现的抽象的方法不止一个,那还是老老实实写个子类继承比较好。
package com.skypyb.templateMethod;
/**
* 模板方法中该节点的实现比较复杂的话可以这样,定义一个专门的类来继承
* @author pyb www.skypyb.com www.yibobo.top
*/
public class AlipayTemplate extends RechargeTemplateMethod {
@Override
public void modeOfPayment() {
System.out.println("用支付婊付钱");
}
}
package com.skypyb.templateMethod;
/**
* 客户端,即具体使用者
* 可根据需要使用不同的模板实现
*
*
*/
public class Client {
public static void main(String[] args) {
RechargeTemplateMethod method = new AlipayTemplate();
method.process();//支付婊
System.out.println();
method = new WeChatTemplate();
method.process();//weChat
System.out.println();
/**
* 匿名内部类实现
*/
new RechargeTemplateMethod() {
@Override
public void modeOfPayment() {
System.out.println("用 PY 付钱");
}
@Override
public void luckyDraw() {
System.out.println("抽到SSR辣!");
}
}.process();
}
/**
* 内部类方式实现
*/
static class WeChatTemplate extends RechargeTemplateMethod {
@Override
public void modeOfPayment() {
System.out.println("用 WeChat 付钱");
}
}
}
System.out:
进入充值界面…
氪金!
用支付婊付钱
抽奖,哇又是保底SR
进入充值界面…
氪金!
用 weChat 付钱
抽奖,哇又是保底SR
进入充值界面…
氪金!
用 PY 付钱
抽到SSR辣!
我写的代码只是最简单的,进行举例用。模板方法模式在生产中应用有可能不止一个 abstract method。
甚至子类不止要重写抽象方法,非抽象的方法也有可能选择性重写。
但是,就算其每个节点变化多端,只要执行流程还是固定的,使用该模式肯定能让编码效率、维护效率、扩展效率更上一层楼。
java 模板方法_设计模式(java实现)_模板方法模式(Template method)相关推荐
- JAVA设计模式(14) —行为型模板方法模式(Template Method)
1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...
- [设计模式-行为型]模板方法模式(Template Method)
一句话 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 概括 解析 看过<如何说服女生上床>这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇.打破僵局.展开追求.接吻.前戏.动 ...
- 设计模式之模板方法模式(Template Method)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 白话设计模式--行为型模式--Template Method模式(模板方法模式)
结构型模式就这么结束了,行为型模式就这么开始了. 首先就是最简单最容易最常用的Template Method模式. 我们怎么定义 Template Method模式呢?简单来说,就是先定义一个骨架(框 ...
- 5_异常_多线程_设计模式_IO流_网络编程_反射
JavaSE_第五周 异常 异常的概念 什么是异常 概念 概念:程序在运行过程中出现的特殊情况异常-----通过Jvm将异常的信息打印在控制台---告诉开发者(当前程序在某个环节出现了哪些问题!) 异 ...
- 设计模式之行为模式中的模板方法模式(template method)
设计模式之行为模式中的模板方法模式(template method) 声明 一.行为模式 二.模板方法模式 三.实例 概况描述 代码 运行结果 优点 类似的模式 优秀文章 声明 本人写此文章只是为了梳 ...
- 设计模式之模板方法模式(Template Method Pattern)
模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它 ...
- 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...
最新文章
- Android Studio 项目代码全部消失--出现原因及解决方法
- android之数据存储,Android数据存储之File
- 解决ThinkPHP关闭调试模式时报错的问题汇总
- 初学者学python好还是c-C 和 Python语言先学哪个好?
- 为什么想要去探究Mybatis源码?(1)
- crf java实现_Tensorflow实现crf损失
- Service Worker,Web Worker,WebSocket的对比
- 百度、WordPress纷纷宣布停用React
- P1666 前缀单词
- Intel 64/x86_64/IA-32/x86处理器 - 指令格式(8) - 80386/32位指令前缀
- SpringBoot : BeanFactory
- android开发环境的调研
- Unix环境高级编程第三版
- Win10 SecoClient连接报错:无法启用虚拟网卡适配
- 前端js实现批量下载文件
- 滴滴新出的移动端UI组件库 Mand Mobile,提前蹭个热度
- Python学习笔记三之编程练习:循环、迭代器与函数
- 关于springboot微信点餐的错题集
- 网络 - VXLAN
- Python强大的自省机制