目录
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 { @Override public 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 { @Override public 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");//故意设置为非法字符 } }
实际应用中并不会这么来进行计算操作,但这只是纯粹演示模板方法模式的用法,从父类调用子类。