让次类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
模版方法模式的核心思想:
Java抽象类时,经常会遇到模版模式;抽象类中给出程序的骨架和轮廓,在抽象类中编写主方法,
申明抽象方法,迫使继承父类的子类实现剩余的逻辑;
注意:模版类必须是抽象类,定义一个主方法,该方法为外部程序调用的入口(一般申明为final)
这个方法可以实现对多个模版的调用,这个类中定义子类要继承的实现的抽象方法,这些方法强制子类实现;
简单点说,就是父类控制着子类的业务逻辑,而子类根据不同的业务来实现父类的抽象方法;
一个简单计算器的设计与实现:
模版类AbstractCalculator.java
public abstract class AbstractCalculator
{
//定义一个主方法(模版方法)
public final int calculate(String str1,String str2)
{
int arrayInt[] = split(str1,str2);
return calculate(arrayInt[0],arrayInt[1]);
}
public abstract int calculate(int num1,int num2);
public int[] split(String str1,String str2)
{
String array[] = str1.split(str2);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}
public class Plus extends AbstractCalculator
{
public int calculate(int num1,int num2)
{
return (num1 + num2);
}
}
public class Minus extends AbstractCalculator
{
public int calculate(int num1,int num2)
{
return (num1-num2);
}
}
public class Multiply extends AbstractCalculator
{
public int calculate(int num1,int num2)
{
return (num1*num2);
}
}
public class Divide extends AbstractCalculator
{
public int calculate(int num1,int num2)
{
return (num1/num2);
}
}
public class Default extends AbstractCalculator
{
public int calculate(int num1,int num2)
{
return 0;
}
}
public class MainTest
{
public static void main(String[] args)
{
while(true)
{
//接收表达式的输入
System.out.println("准备输入数据...");
String str1 = System.console().readLine();
//初始化实例
AbstractCalculator calculator;
String str2 = "";
if(str1.indexOf("+") != -1)
{
calculator = new Plus();
str2 = "\\+";
}else if(str1.indexOf("-") != -1)
{
calculator = new Minus();
str2 = "\\-";
}else if(str1.indexOf("*") != -1)
{
calculator = new Multiply();
str2 = "\\*";
}else if(str1.indexOf("/") != -1)
{
calculator = new Divide();
str2 = "\\/";
}else
{
calculator = new Default();
}
//开始计算
int value = calculator.calculate(str1,str2);
System.out.println("计算结果是="+value);
}
}
}
Java中主要应用在Java EE的开发请求处理的HttpServlet,Struts2,Spring 也是依据这种框架来实现的。