首先给出例子 国际电子商务系统:需求各国税率不同,设计一个订单处理系统,包括税率计算,可以用继承来设计, 不同国家对应一个SalesOrder ,但是这样会引起组合爆炸问题,并在代码中引入大量switch语句 所以用Strategy模式来解决问题,根据设计模式的根本原则,面向接口编程,抽象变化并封装之。在这个例子中,变化的元素是税率处理,所以把它抽象出来作为一个接口, 类图在下面给出。
这样当国家变化的时候,只需要增加一个CalcTax的实现就行。
下面给出代码
package Strategy;
public abstract class HandleTax {
abstract public double handleTax(long itemID,double price);
}
package Strategy;
public class SalseOrder {
HandleTax handle ;
long itemID ;
double price ;
public SalseOrder(HandleTax handle,long itemID, double price){
this.itemID=itemID;
this.handle=handle;
this.price=price;
}
public void process(){
double tax=handle.handleTax(itemID, price);
System.out.println("tax is" +tax);
}
}
package Strategy;
public class TaskController {
long itemID = 100;
double price= 100;
public void process(){
HandleTax handle =new Strategy2();
SalseOrder mySO =new SalseOrder(handle,itemID,price);
mySO.process();
}
public static void main(String []args){
TaskController task=new TaskController();
task.process();
}
}
package Strategy;
public class Strategy1 extends HandleTax {
double tax;
@Override
public double handleTax(long itemID,double price){
tax=(itemID+100+price)*3.00;
return tax ;
}
}
package Strategy;
public class Strategy2 extends HandleTax {
double tax ;
@Override
public double handleTax(long itemID, double price) {
tax=(itemID)*3 ;
return tax;
}
}
这里需要调用哪个处理税率的方法 由TaskController 提供,它可以读配置文件获得此内容。
如果又有变化,如果税率和某人年龄有关 可以传递一个对SalesOrder的引用给它 。这样就可以解决。
下面我们看一下什么是Strategy模式
GOF的《设计模式》中这样说
定义一系列算法,把他们一个个的封装起来,并且使他们可相互替换。Striategy模式使算法可独立与使用它的客户端。
下一个模式就来说 template method模式 并给出它们间的比较
Strategy 类图