Java 设计模式 之 模板方法模式(Template Method)

目录

模板方法模式(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 {
    @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");//故意设置为非法字符
    }
}

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