策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户
《以大话设计模式》第二章 商场促销 为例子
1:算法抽像类 支持所有算法的公共接口
/**
* @author admin
* 算法抽像类 支持所有算法的公共接口
*/
public abstract class CashSuper {
/**
* @Title: acceptCash
* @Description: TODO
* @param: @param money
* @param: @return
* @return: double
* @throws
*/
public abstract double acceptCash(double money);
}
2:正常收费算法、打折算法实现、满300 送100 算法实现
/**
* @author admin
* 正常收费算法
*/
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money)
{
return money;
}
}
/**
* @author admin
* 打折算法实现
*/
public class CashRebate extends CashSuper {
private double moneyRebate = 1d;
CashRebate(String moneyRebate)
{
this.moneyRebate = Double.parseDouble(moneyRebate);
}
@Override
public double acceptCash(double money)
{
return money*moneyRebate;
}
}
/**
* @author admin
* 满300 送100 算法实现
*/
public class CashReturn extends CashSuper {
private double moneyCondition = 0;
private double moneyResult = 0;
CashReturn(double moneyCondition, double moneyResult)
{
this.moneyCondition = moneyCondition;
this.moneyResult = moneyResult;
}
@Override
public double acceptCash(double money)
{
double result = money;
if (money > moneyCondition)
{
result = money - moneyResult;
}
return result;
}
}
3:现金上下文类 根据不同选择 返回不同的计算现金策略
/**
* @author admin
* 现金上下文类 根据不同选择 返回不同的计算现金策略
*/
public class CashContext
{
private CashSuper cs;
public CashContext(String type)
{
//简单工厂模式的一种应用
switch (type)
{
//正常收费
case "1" :
cs = new CashNormal();
break;
//满300 送100
case "3" :
cs = new CashReturn(300, 100);
break;
//打8折
case "2" :
cs = new CashRebate("0.8");
break;
}
}
/**
* @Title: getResult
* @Description: 调用CashSuper 的 getResult方法去调用具体的算法
* @param: @param money
* @param: @return
* @return: double
* @throws
*/
public double getResult(double money)
{
return cs.acceptCash(money);
}
}
4:显示器类 main方法
import java.util.Scanner;
/**
* @author admin
* 显示器类 main方法
*/
public class CashView {
/**
* @Title: main
* @Description: TODO
* @param: @param args
* @return: void
* @throws
*/
public static void main(String[] args)
{
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
System.out.println("请输入收费金额:");
double money = Double.parseDouble(in.next());
System.out.println("请按下面的提示输入,1 代表:正常收费。2 代表打8折。3 代表 满300送100");
String type = in.next();
CashContext cashContext = new CashContext(type);
double resultMoney = cashContext.getResult(money);
System.out.println("实际收费:" + resultMoney);
}
}
5:策略模式总结
策略模式封装了变化