目录

模板方法模式(Template Method)


模板方法模式(Template Method)

1、模板方法模式:指一个抽象类中,有一个非抽象的主方法,和其它抽象或非抽象的辅助方法,再定义一个子类,继承该抽象类,重写其抽象方法(或子类需要重写的其它方法),通过调用抽象类的主方法,实现对子类的方法调用。

2、关系图如下:

在 AbstractCalculator 抽象类中定义一个主方法 calculate(非抽象),calculate() 调用其它辅助方法如 spilt() 等(也可以不调用),Plus(加法) 和 Minus (减法)分别继承 AbstractCalculator 类,通过对 AbstractCalculator 的调用实现对子类的调用。

3、下面使用代码来实现上图(本示例纯粹为演示模式的思想和设计):

package main.templateMethod;import java.util.logging.Logger;//抽象类
public abstract class AbstractCalculator {/*** 抽象类中的主方法。设计成 final ,子类无法继承。calculate:计算** @param a* @param b* @return*/public final float calculate(String a, String b) {Logger logger = Logger.getAnonymousLogger();logger.info("用户请求计算:a=" + a + ",b=" + b);float[] floats = check(a, b);//子类会重写下面的 calculate(int a, int b) 方法,所以这里调用其实是子类的方法return calculate(floats[0], floats[1]);}/*** a 、b 不能为 null;不能为空;必须是数字格式,不能是非法的其它字符,如 zbc123** @param a* @param b* @return*/public float[] check(String a, String b) {float[] floats = new float[2];if (a != null && !"".equals(a) && a.matches("-?\\d+.?\\d+")) {floats[0] = Float.parseFloat(a);} else {throw new RuntimeException("参数 " + a + " 为非法数字...");}if (b != null && !"".equals(b) && b.matches("-?\\d+.?\\d+")) {floats[1] = Float.parseFloat(b);} else {throw new RuntimeException("参数 " + b + " 为非法数字...");}return floats;}//需要子类重写的方法,这里重载了上面的 calculate(String a, String b)public abstract float calculate(float a, float b);}

4、下面是两个子类:

package main.templateMethod;import java.util.logging.Logger;public class Plus extends AbstractCalculator {@Overridepublic float calculate(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info("加法运算:" + a + " + " + b);return a + b;}
}
package main.templateMethod;import java.util.logging.Logger;public class Minus extends AbstractCalculator {@Overridepublic float calculate(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info("减法运算:" + a + " - " + b);return a - b;}
}

5、测试如下:

package main.test;import main.templateMethod.AbstractCalculator;
import main.templateMethod.Minus;
import main.templateMethod.Plus;import java.util.logging.Logger;public class Test {public static void main(String[] args) {Logger logger = Logger.getAnonymousLogger();AbstractCalculator calculator_plus = new Plus();float result1 = calculator_plus.calculate("25", "50.55");logger.info("result1=" + result1);AbstractCalculator calculator_minus = new Minus();float result2 = calculator_minus.calculate("120.55", "-40");logger.info("result2=" + result2);calculator_minus.calculate("120.55", "-40xx");//故意设置为非法字符}
}

实际应用中并不会这么来进行计算操作,但这只是纯粹演示模板方法模式的用法,从父类调用子类。

Java 设计模式 之 模板方法模式(Template Method)相关推荐

  1. java 模板方法_设计模式(java实现)_模板方法模式(Template method)

    设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...

  2. 设计模式之模板方法模式(Template Method Pattern)

    模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它 ...

  3. 设计模式之模板方法模式(Template Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. JAVA设计模式(14) —行为型模板方法模式(Template Method)

    1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...

  5. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  6. Java 设计模式之模板方法模式

    一.了解模板方法模式 1.1 什么是模板方法模式 模板方法模式 Template Method Parrern)在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变 ...

  7. Java设计模式之模板方法模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  8. JAVA设计模式之--模板方法模式

    序言 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单.在这三个 ...

  9. 白话设计模式--行为型模式--Template Method模式(模板方法模式)

    结构型模式就这么结束了,行为型模式就这么开始了. 首先就是最简单最容易最常用的Template Method模式. 我们怎么定义 Template Method模式呢?简单来说,就是先定义一个骨架(框 ...

  10. [设计模式-行为型]模板方法模式(Template Method)

    一句话 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 概括 解析 看过<如何说服女生上床>这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇.打破僵局.展开追求.接吻.前戏.动 ...

最新文章

  1. element ui表单校验prop的链式写法----源码分析
  2. xml之dom4j解析
  3. Android微信跳一跳,自动跳App实现
  4. 第11章 数据库安全性
  5. Redis--安装与配置(Linux与Windows)
  6. 【资料】《模拟电子技术基础-童诗白第四版》
  7. selenium 截长图
  8. 注册石墨文档无法连接服务器,石墨文档没有访问权限的解决方法
  9. 制作WIN7+XP+DOS+PE多系统启动光盘
  10. 4选1数据选择器程序及testbench文件,给出仿真波形,分析
  11. miniUI datagrid 接收不到数据显示undifined
  12. 【图片resize】图片三种缩放方式/letterbox_image实现
  13. 第四届“绽放杯”5G应用征集大赛圆满落幕 中国移动参与项目获奖数量四年蝉联第一
  14. BLDC反电势过零检测计算
  15. CodeForces - 1413C Perform Easily(双指针)
  16. EDA项目 出租车计价器 赏析
  17. codevs 1219 骑士游历 1997年
  18. WIN10安装CH340驱动出现感叹号的解决办法总结
  19. 《孙子兵法》与《战争论》对比
  20. 主叫线路识别限制CLIR

热门文章

  1. MPEG4 笔记3(TRAK,TKHD, MVHD)
  2. MFC 的几个常用函数,用来计算文件大小,下载速度,转换时间的
  3. java 中文字符串 排序_Java实现对中文字符串的排序功能实例代码
  4. 拓端tecdat|R语言投资组合优化求解器:条件约束最优化、非线性规划求解
  5. 拓端tecdat|R语言再保险合同定价案例研究
  6. 拓端tecdat|R语言曲线回归:多项式回归、多项式样条回归、非线性回归数据分析
  7. Android入门笔记04
  8. shell脚本语言和java_shell脚本学习与总结
  9. pandas常用函数总结
  10. Ubuntu下yolov4训练自己的数据集