模版模式就是一个抽象类把具体的主要算法骨架写好,而具体的算法由子类来实现:
package com.djk.design.Template;
/**
* 模版模式
* @author djk
*
*/
public class TemplateTest
{
public static void main(String[] args)
{
CalculationTemplate calculationTemplate = new Add();
double result=calculationTemplate.doCalculation();
System.out.println(result);
}
}
/**
* 算术实体类
* @author djk
*
*/
class Calculation
{
private double i;
private double j;
private MyOperator myOperator;
public Calculation(double i,double j,MyOperator myOperator)
{
this.i = i;
this.j = j;
this.myOperator = myOperator;
}
public MyOperator getMyOperator() {
return myOperator;
}
public void setMyOperator(MyOperator myOperator) {
this.myOperator = myOperator;
}
public double getI() {
return i;
}
public void setI(double i) {
this.i = i;
}
public double getJ() {
return j;
}
public void setJ(double j) {
this.j = j;
}
}
/**
* 计算模版
* @author djk
*
*/
abstract class CalculationTemplate
{
public abstract Calculation setCalculation();
/**
* 主要算法
* @return
*/
public double doCalculation()
{
Calculation calculation = setCalculation();
if(null == calculation)
{
System.out.println("对不起,请您输入正确的算术");
return 0;
}
double x = calculation.getI();
double y = calculation.getJ();
MyOperator myOperator = calculation.getMyOperator();
switch (myOperator) {
case ADD:
return x+y;
case MINUS:
return x-y;
case MULTIPLY:
return x*y;
case DIVIDE:
try {
return x/y;
} catch (Exception e) {
System.out.println("被除数不能为0");
return 0;
}
default:
System.out.println("没有找到运算符号");
return 0;
}
}
}
/**
* 加法
* @author djk
*
*/
class Add extends CalculationTemplate
{
@Override
public Calculation setCalculation()
{
return new Calculation(1,2,MyOperator.DIVIDE);
}
}
enum MyOperator
{
ADD("+"),MINUS("-"),MULTIPLY("*"),DIVIDE("/");
MyOperator(String value)
{
this.value = value;
}
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
正如上面的列子所示,抽象类CalculationTemplate是一个模版里面有2个方法一个是抽象的setCalculation()方法,由子类重写,主要是设置算术运算的具体运算方式(加,减,乘,除),另一个方法是doCalculation(),这个方法是根据设置的运算方式而进行具体的运算后得出的结果,子类只要继承CalculationTemplate这个模版然后设置一下具体的运算方式以及2个运算的值然后客户端调用doCalculation就能得到运算后的值。。。