UML图
代码结构为了方便代码阅读,只写了折扣和满x减y员的策略类
public class CashContext {
private CashSuper cashSuper;
public CashContext(CashSuper cashSuper) {
super();
this.cashSuper = cashSuper;
}
public double getResult(double money) {
return cashSuper.acceptCash(money);
}
}
/** 折扣类 */
public class CashRebate extends CashSuper {
private double moneyRebate;
public CashRebate(double moneyRebate) {
super();
this.moneyRebate = moneyRebate; //省略参数有效性验证
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
public double getMoneyRebate() {
return moneyRebate;
}
public void setMoneyRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
}
/** 满x减y类 */
public class CashReturn extends CashSuper {
private double moneyCondition;
private double moneyReturn;
public CashReturn(double moneyCondition, double moneyReturn) {
super();
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
double result = money;
if(money > moneyCondition) {
result = money - Math.floor((money / moneyCondition)) * moneyReturn;
}
return result;
}
public double getMoneyCondition() {
return moneyCondition;
}
public void setMoneyCondition(double moneyCondition) {
this.moneyCondition = moneyCondition;
}
public double getMoneyReturn() {
return moneyReturn;
}
public void setMoneyReturn(double moneyReturn) {
this.moneyReturn = moneyReturn;
}
}
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
public class Client {
public static void main(String[] args) {
double originPrice = 500; //假设未打折前总价500
CashContext context = null;
String type = "满300减100"; //也可以由用户输入
switch (type) {
case "满300减100":
context = new CashContext(new CashReturn(300, 100));
break;
case "打8折":
context = new CashContext(new CashRebate(0.8));
break;
default:
break;
}
double realPrice = context.getResult(originPrice);
System.out.println("realPrice: " + realPrice);
}
}
个人总结:
1.策略模式与代理模式、命令模式的区别
策略模式:context类只将策略的行为抽取出来进行统一实现,并不知道策略内部详细信息,一个context统一了多个策略
代理模式:一个Proxy只对应一个被代理对象,Proxy与被代理对象实现的是同一个接口,从代码看,被代理队形(书中的Persuit类)中还包含了一个SchoolGirl对象。参考:http://zyslovely.iteye.com/blog/1283846
命令模式:命令模式含有不同的请求做不同的事,隐藏接收者的执行细节,常见菜单事件,策略模式含有不同的算法做相同的事,区别在于时候含有接收者,命令模式有,策略模式没有。命令模式中的命令可以单独运行。参考http://blog.csdn.net/jiafu1115/article/details/6980423