设计模式-策略模式

来源:互联网 发布:时间都去哪儿了 知乎 编辑:程序博客网 时间:2024/06/04 00:51
1、策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法变化,不会影响到使用算法的客户
举个例子商场收银促销活动,使用打折还是返利,其实都是一些算法,使用简单工厂生成算法对象也没有问题,但是算法本身是一种策略,最重要的是算法是

随时都有可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式。

1、抽象策略类

/**
 * ClassName:CashSuper <br/>
 * Description: 抽象策略类. <br/>
 */
public abstract class CashSuper {


/**
* 获得总收费

* @param money
*            促销前的总额
* @return 促销后总额
*/
public abstract double acceptCash(double money);
}

2、正常收费

public class CashNormal extends CashSuper {


/**
* 正常收费.

* @see org.jiajun.pattern.test2.CashSuper#acceptCash(double)
*/
@Override
public double acceptCash(double money) {


return money;
}


}

3、打折收费

public class CashRebate extends CashSuper {


/**
* 折扣率 如八折(0.8)
*/
private double moneyRebate = 1d;


public CashRebate(String moneyRebate) {
this.moneyRebate = Double.parseDouble(moneyRebate);
}


@Override
public double acceptCash(double money) {


return money * moneyRebate;
}
}

4、满多少返多少

public class CashReturn extends CashSuper {
// 返利收费,如满300返100


private double moneyCondition = 0d;
private double moneyReturn = 0d;


public CashReturn(String moneyCondition, String moneyReturn) {
this.moneyCondition = Double.parseDouble(moneyCondition);
this.moneyReturn = Double.parseDouble(moneyReturn);
}


@Override
public double acceptCash(double money) {
double result = money;
if (result >= moneyCondition)
result = money - Math.floor(money / moneyCondition) * moneyReturn;
return result;
}


}

5、根据不同业务使用不同的策略

public class CashContext {


private CashSuper cashSuper;


public CashContext(CashSuper cashSuper) {
this.cashSuper = cashSuper;
}


/**
* 根据策略不同获得不同的结果

* @param money
* @return
*/
public double getResult(double money) {
return cashSuper.acceptCash(money);
}
}

这样就能随时更换促销活动了。

0 0
原创粉丝点击