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

本文介绍了一种常用的设计模式——模板方法模式。通过一个具体的计算器示例,展示了如何使用抽象类和子类协作来实现算法的基本步骤。介绍了模式的概念、实现方式及测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:

模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。

模板方法模式,技术具体是:一个抽象类中,对外方法另外有n个方法,这些方法,可以是抽象的,也可以是实际的方法,定义子类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:



抽象类AbstractCalculator 有一个Final修饰的对外主方法,另有一个待子类实现的抽象方法

public abstract class AbstractCalculator {
    public final int calculate(String exp, String opt) {
        int array[] = split(exp, opt);
        return calculate(array);
    }

    public int[] split(String exp, String opt) {
        String array[] = exp.split(opt);
        int arrayInt[] = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            int iTemp = 0;
            try {
                iTemp = Integer.parseInt(array[i]);
            } catch (Exception e) {
                e.printStackTrace();
            }
            arrayInt[i] = iTemp;
        }
        return arrayInt;
    }

    public abstract int calculate(int... num);

}
子类实现抽象方法:
public class Plus extends AbstractCalculator {
    @Override
    public int calculate(int... num) {
        int iRes = 0;
        for (int i = 0; i < num.length; i++) {
            iRes += num[i];
        }
        return iRes;
    }
}

public class Minus extends AbstractCalculator {
    @Override
    public int calculate(int... num) {
        int iRes = 0;
        for (int i = 0; i < num.length; i++) {
            if (i == 0) {
                iRes += num[i];
            } else {
                iRes -= num[i];
            }
        }
        return iRes;
    }
}

测试类:
public class WorkClass {
    public void test() {
        StringBuilder exp = new StringBuilder("1+2+3+4");
        AbstractCalculator calculator = new Plus();
        System.out.println(String.format("%s=%s",exp,calculator.calculate(exp.toString(),"\\+")));
        exp.delete(0,exp.length()).append("1-2-3-4");
        calculator= new Minus();
        System.out.println(String.format("%s=%s",exp,calculator.calculate(exp.toString(),"\\-")));
    }
}



测试结果:
06-21 16:54:05.348 8253-8253/com.example.qinghua_liu.myapplication I/System.out: 1+2+3+4=10
06-21 16:54:05.350 8253-8253/com.example.qinghua_liu.myapplication I/System.out: 1-2-3-4=-8

结语:

客户成功通过对AbstractCalculator的调用实现对子类具体实现方法的调用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值