`
lpdyxm
  • 浏览: 25596 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

策略模式

阅读更多

策略模式:

1.主要用于封装系列的算法,这些算法通常被封装在一个被称为Context的类中,客户端程序可以自由选择其中的一种算法,或让客户端选择一个最佳的算法

2.使用策略模式的优势:为了支持算法的自由切换

例如:

打折的需求:里面有许多打折算法,如何进行切换

先定义一个接口:

// 打折算法的接口

public interface DiscountStrategory{

 double getDiscount(double originPrice);

}

 

下面为该接口提供两个策略类

//vip 打折算法实现了算法接口

public class VipDiscount implements DiscountStrategory{

  public double getDiscount(double orignPrice){

   system.out.println(“使用vip折扣”);、

  return orignPrice*0.5;

}

}

//旧书折扣策略

public class OldDiscount implements DiscountStrategory{

  public double getDiscount(double orignPrice){

   System.out.println("使用旧书折扣");

return  orignPrice* 0.7;

}

}

 

Context类:

//这个类主要用于为客户端代码选择合适折扣策略,当然也允许用户自由选择折扣策略

public class DiscountContext{

   //组合一个DiscountStrategory对象

private  DiscountStrategory strategory;

public  DiscountContext(DiscountStrategy strategory){

  this.strategory=strategory;

}

public double getDiscountPrice(double price){

   if(strategory==null){
   strategory=new OldDiscount();

 

}

 return this.strategory.getDiscount(price);

 

}

public void changeDiscount(DiscountStrategory strategory){
  this.strategory=strategory;

}

}

测试类:

public class StategoryTest{

  public static void main(String args[]){

   DiscountContext dc=new DiscountContext(null);//客户端没有选择打折策略类

double price1=79;

//使用默认的打折策略

System.out.println(dc.getDiscountPrice(79));

//客户端选择合适的打折策略

dc.changeDiscount(new VipDiscount());

double price2=89;

 system.out.println(dc.getDiscountPrice(89));

}

}

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics