Strategy

首先给出例子  国际电子商务系统:需求各国税率不同,设计一个订单处理系统,包括税率计算,可以用继承来设计, 不同国家对应一个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 类图


 


 


 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值