策略模式
- 它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。
- Strategy类为所有算法的父类,其定义了一个用户使用接口——AlgorithmInterface(),此接口用于实现各种算法,将计算后的结果返回给调用处。
- StrategyA、StrategyB、StrategyC表示各种不同的算法子类,他们共同继承Strategy父类,并各自重写AlgorithmInterface()方法,已达成不同的算法。
- Context上下文操作类,管理着所有的策略类,根据用户传入的数据来选择相应的策略,将其使用接口AlgorithmInterface()方法返回给用户。
使用策略模式实现商场收银系统
功能:
* 1.根据客户所购买的商品的数量和单价,来向客户收费
* 2.根据需要打一定折扣扣
* 3.满返活动
策略类(Strategy类)
/**
* 策略类
* @author Administrator
*
*/
public abstract class CashStrategy {
/**
* 接收原本价格,返回运算后的价格
* @param money
* @return
*/
public abstract double acceptCash(double money) ;//AlgorithmInterface()接口方法,接收原始价位,返回优惠后的价位
}
算法类A(StrategyA)——正常收费
/**
* 正常收费标准
* @author Administrator
*
*/
public class CashNormal extends CashStrategy{
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money;
}
}
算法类B(StrategyB)——打折
/**
* 打折收费
* @author Administrator
*
*/
public class CashRebate extends CashStrategy{
private double moneyRebate = 1 ;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate ;
}
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money * this.moneyRebate;
}
}
算法类C(StrategyC)—— 满减活动
public class CashReturn extends CashStrategy{
private double moneyCondition = 0 ;
private double moneyReturn = 0 ;
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
if (money >= moneyCondition) {
return money - (int)(money / moneyCondition) * moneyReturn ;
}
return money;
}
}
策略工厂(Context)
结合简单工厂模式将上下文类改装为工厂形式,避免了逻辑代码暴露给客户端
public class ContextFactory {
CashStrategy cs = null ;
public ContextFactory(String str) {
switch (str) {
case "正常收费":
cs = new CashNormal() ;
break;
case "满300返100":
cs = new CashReturn(300, 100) ;
break;
case "打八折":
cs = new CashRebate(0.8) ;
break;
default:
break;
}
}
public double GetResult(double money) {
return cs.acceptCash(money) ;
}
}
客户端
/**
* 商场收银软件
* 功能:
* 1.根据客户所购买的商品的数量和单价,来向客户收费
* 2.根据需要打一定折扣扣
* 3.满返活动
*
* 将判断交给工厂,解放客户端
* @author Administrator
*
*/
public class User {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] str = {"正常收费","满300返100","打八折"} ;
int n = 5 ;
double price = 352 ;
ContextFactory cf = new ContextFactory(str[1]) ;
System.out.println(cf.GetResult(n * price));
}
}
总结
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种与使用算法类之间的耦合。
~
策略模式的Strategy类层为Context定义了一系列的可重用的算法或行为。继承有助于析取出这些算法中的公共功能
~
策略模式的优点是为了简化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
~
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不用业务规则,就可以考虑使用策略模式处理各种变化的可能性。