在软件开发中有时候会遇到这样的情况,某个功能的实现需要多个步骤,这些步骤都是很明确的(第一步是什么,第二步是什么...比如做配菜:第一步是洗菜,第二步是切菜,第三步是装盘);其中某些步骤的做法是固定的(例如洗菜--用水泡洗干净、装盘--把菜摆放到盘子里),而有些步骤的做法就不确定(例如切菜--可以切丁、切块、切片。。。)。所以就有了模版方法模式,在模版方法模式中有一个抽象类,在该抽象类中有一个final的方法,用来完成一个功能(比如制作配菜),同时也有完成这个功能的各个步骤的方法(比如洗菜,切菜,装盘),而在这些代表各个步骤的方法中,那些可以确定的方法就具体是些,而那些不确定的方法就定义为抽象方法留在子类中实现。
package mode.template_method; /** * * 这里定义一个抽象的计算机类,有一个final方法用来完成计算,它首先调用分割操作,把数字分离出来,然后调用了计算方法来计算, * 具体要做什么样的计算,在子类中去具体实现 * * */ public abstract class AbstractCalculator { /* 主方法,实现对本类其他方法的调用 */ public final int calculate(String exp, String opt) { int array[] = split(exp, opt); return calculate(array[0], array[1]); } /* 被子类重写的方法 */ abstract public int calculate(int num1, int num2); public int[] split(String exp, String opt) { String array[] = exp.split(opt); int arrayInt[] = new int[2]; arrayInt[0] = Integer.parseInt(array[0]); arrayInt[1] = Integer.parseInt(array[1]); return arrayInt; } }
package mode.template_method; /** * * 这里实现一个计算加法的子类 * * */ public class Plus extends AbstractCalculator { @Override public int calculate(int num1, int num2) { // TODO Auto-generated method stub return num1 + num2; } }
测试
package mode.template_method; public class Test { public static void main(String[] args) { String exp = "8+8"; AbstractCalculator plus = new Plus(); System.out.println(plus.calculate(exp, "\\+")); } }
原文地址:http://blog.csdn.net/u012613903/article/details/44197905