定义了多种不同的算法,根据不同场景应用不同的算法。
应用场景:需要根据不同情况选用不用的方法进行处理,如超市促销
1、定义操作父类
public class CalSuper {
/*定义变量,用于操作,在父类中定义,子类可以通过get方法获取,
* 不然每个子类都要重复单独定义
* */
private Double numberA;
private Double numberB;
public Double getNumberA() {
return numberA;
}
public void setNumberA(Double numberA) {
this.numberA = numberA;
}
public Double getNumberB() {
return numberB;
}
public void setNumberB(Double numberB) {
this.numberB = numberB;
}
//定义操作方法
public double getResult() throws Exception{
double result=0;
return result;
};
}
2、定义操作加法子类
public class CalAdd extends CalSuper {
//获取父类变量,实现具体实现
public double getResult() {
double result=0;
result=getNumberA()+getNumberB();
return result;
};
}
3、定义操作减法子类
public class CalSub extends CalSuper {
//获取父类变量,实现具体实现
public double getResult() {
double result=0;
result=getNumberA()-getNumberB();
return result;
};
}
4、定义操作乘法子类
public class CalMul extends CalSuper {
//获取父类变量,实现具体实现
public double getResult() {
double result=0;
result=getNumberA()*getNumberB();
return result;
};
}
5、定义操作除法子类
public class CalDiv extends CalSuper {
//获取父类变量,实现具体实现
public double getResult() throws Exception {
double result=0;
if(getNumberB()==0.00) {
throw new Exception("除数不能为0");
}
result=getNumberA()/getNumberB();
return result;
};
}
6、定义策略类
public class CalStrategy {
//组合操作父类,实际操作由其执行
private CalSuper calSuper;
public CalStrategy(String operation) {
switch (operation) {
case "+":
calSuper=new CalAdd();
break;
case "-":
calSuper=new CalSub();
break;
case "*":
calSuper=new CalMul();
break;
case "/":
calSuper=new CalDiv();
break;
}
}
public double getResult(Double numberA,Double numberB) throws Exception {
calSuper.setNumberA(numberA);
calSuper.setNumberB(numberB);
return calSuper.getResult();
}
}
7、客户端操作
public class CalMain {
public static void main(String[] args) throws Exception {
CalStrategy calStrategy1=new CalStrategy("+");
System.out.println(calStrategy1.getResult(11.00,11.00));
CalStrategy calStrategy2=new CalStrategy("-");
System.out.println(calStrategy2.getResult(11.00,1.00));
CalStrategy calStrategy3=new CalStrategy("*");
System.out.println(calStrategy3.getResult(11.00,11.00));
CalStrategy calStrategy4=new CalStrategy("/");
System.out.println(calStrategy4.getResult(11.00,11.00));
System.out.println(calStrategy4.getResult(11.00,0.00));
}
}
8、输出结果
22.0
10.0
121.0
1.0
Exception in thread "main" java.lang.Exception: 除数不能为0
at com.ytu.strategy.domain.CalDiv.getResult(CalDiv.java:12)
at com.ytu.strategy.domain.CalStrategy.getResult(CalStrategy.java:30)
at com.ytu.strategy.manager.CalMain.main(CalMain.java:19)
9、总结
文中举例的代码与上一个工厂模式的代码类似,两者相似,都是根据不同场景返回不同对象来具体操作,但通过工厂返回的是父类对象,操作还是具体对象来操作,从头到尾有工厂对象和父类对象两个;而策略是构造了父类属性,操作是由其属性来操作的,从头到尾只有策略一个对象,对外更加隐藏了。