设计模式-策略模式(Strategy)

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

以下通过商场在各种活动模式下的结算方式演示了策略模式与简单工厂模式的结合

1.创建收费基类

/**
 * 现金收费基类
 * 
 * @author WangPeng
 *
 *         CashSuper.java 2015年9月28日 下午12:40:18
 */
public abstract class CashSuper {
  /**
   * 现金结算函数
   * 
   * @param money 应收金额
   * @return
   */
  public abstract double acceptCash(double money);
}
2.列举可能的收费方式

a.正常收费:

/**
 * 正常收费子类
 * 
 * @author WangPeng
 *
 *         CashNormal.java 2015年9月28日 下午12:42:38
 */
public class CashNormal extends CashSuper {
  @Override
  public double acceptCash(double money) {
    return money;
  }
}
b.折扣收费:


/**
 * 折扣子类
 * 
 * @author WangPeng
 *
 *         CashRebate.java 2015年9月28日 下午12:50:11
 */
public class CashRebate extends CashSuper {
  /**
   * 折扣力度
   */
  private double moneyRebate = 1;

  public CashRebate(double moneyRebate) {
    this.moneyRebate = moneyRebate;
  }

  @Override
  public double acceptCash(double money) {
    return money * moneyRebate;
  }
}
c.返利收费

/**
 * 返利子类 (如:满300减100)
 * 
 * @author WangPeng
 *
 *         CashReturn.java 2015年9月28日 下午12:43:42
 */
public class CashReturn extends CashSuper {
  private double moneyCondition = 0.0;
  private double moneyReturn = 0.0;

  public CashReturn(double moneyCondition, double moneyReturn) {
    this.moneyCondition = moneyCondition;
    this.moneyReturn = moneyReturn;
  }

  @Override
  public double acceptCash(double money) {
    if (money >= moneyCondition) {
      return money - Math.floor(money / moneyCondition) * moneyReturn;
    }
    return money;
  }
}
3.创建收费策略上下文

/**
 * 现金收费工厂
 * 
 * @author WangPeng
 *
 *         CashFactory.java 2015年9月28日 下午1:41:34
 */
public class CashContext {
  private CashSuper cs = null;
  public CashContext(String type) {
    switch (type) {
      case "正常收费":
        cs = new CashNormal();
        break;
      case "满300返100":
        cs = new CashReturn(300, 100);
        break;
      case "打8折":
        cs = new CashRebate(0.8);
        break;
      default:
        break;
    }
  }
  public double getResult(double money){
    return cs.acceptCash(money);
  }
}
4.测试

public class Test {
  public static void main(String[] args) {
    // 测试收费 1000元 正常收费
    CashContext cc1 = new CashContext("正常收费");
    // 应付款700
    System.out.println(cc1.getResult(1000));
    // 测试收费 1000元 打8折
    CashContext cc2 = new CashContext("打8折");
    // 应付款800
    System.out.println(cc2.getResult(1000));
    // 测试收费 1000元 满300返100
    CashContext cc3 = new CashContext("满300返100");
    // 应付款700
    System.out.println(cc3.getResult(1000));
  }
}

输出:

1000.0

800.0

700.0

5.总结

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是同样的工作,只是实现不同,他可以用相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值